2014-11-24 4 views
1

잘못된 트랙에있을 수 있으므로 유용한 입력을 사용할 수 있습니다. 다른 시스템의 데이터를 CSV 파일로 받아서 CSV LOAD로 내 DB로 가져올 수 있습니다. 여태까지는 그런대로 잘됐다.CSV LOAD 및 기존 노드 업데이트/새 노드 만들기

업데이트를 수행하기 위해 CSV를 다시로드해야 할 때 화면이 엉망입니다. 추가 사용자 입력이 이미 첨부되어 있으므로 이전 데이터를 삭제할 수 없으므로 CSV 데이터를 가져 오는 쿼리가 필요하고 일치가 발생하고 노드를 찾으면 SET을 사용하여 기존 속성을 덮어 씁니다. DB (새 레코드)에 노드가없는 경우를 잡는 방법을 모르고 노드를 만들어야한다고합니다.

LOAD CSV FROM "file:xxx.csv" AS csvLine 
MATCH (c:Customer {code:"ABC"}) 
SET c.name = name: csvLine[0] 
***OPTIONAL MATCH // Here I am unsure how to express when the node is not found*** 
MERGE (c:Customer { name: csvLine[0], code: csvLine[1]}) 

그래서 이상적으로 사이퍼는 노드가 있는지 확인하고 CSV로 오는 새 속성 또는 SET하여 업데이트를 만들 것 - 노드가 발견되지 않는 경우 - CSV 데이터를 새로 만듭니다.

그리고 - 사이드 노드로 : 노드를 CSV 파일에 있지 않지만 DB에서 사용하지 않는 노드로 표시하려면 어떻게합니까? (이것은 가져 오기에는 불가능할 수도 있지만 삭제 된 레코드를 DB에서 지우려면이 문제를 해결하는 방법을 알고있을 수 있습니다. 최신 CSV 가져 오기와 비교하여 만 발견 할 수 있습니다. 모든 아이디어에 만족합니다.)

가져 오는 동안 그래프를 updaten하는 쿼리를 작성하는 방법에 대한 아이디어 나 힌트가 있습니까?

답변

2

및/또는 ON CREATE 처리기를 사용해야합니다 (http://neo4j.com/docs/stable/query-merge.html#_use_on_create_and_on_match 참조). 두 번째 열의 고객 코드가 식별자라고 가정합니다. 따라서 열 1의 이름이 업데이트시 변경 될 수 있습니다.

LOAD CSV FROM "file:xxx.csv" AS csvLine 
MERGE (c:Customer {code:csvLine[1]}) 
ON CREATE SET c.name = csvLine[0] 
ON MATCH SET c.name = csvLine[0]