我可能走错了路,所以我可以使用一些有用的输入。我通过CSV文件从其他系统接收数据,我可以使用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]})
理想情况下,Cypher会检查节点是否在那里,并通过SET使用CSV附带的新属性进行更新,或者 - 如果找不到节点 - 使用CSV数据创建一个新属性。
并且 - 作为旁注:我如何找到不在CSV文件中但在DB中的节点以便将它们标记为过时? (这可能无法导入,但也许有人知道如何解决这个问题,以便保持数据库清理已删除的记录 - 只能通过与最新的CSV导入进行比较来检测 - 对于每个想法都很满意)。
任何想法或提示如何在导入时编写查询以更新图表?
答案 0 :(得分:3)
您需要使用MERGE
s ON MATCH
和/或ON CREATE
处理程序,请参阅http://neo4j.com/docs/stable/query-merge.html#_use_on_create_and_on_match。我假设第二列中的客户代码是标识符 - 因此第一列中的名称可能会在更新时更改:
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]