使用CSV更新Neo4j中的现有关系属性值

时间:2018-07-10 13:32:59

标签: neo4j cypher

Neo4j中已经有一些数据,数据以以下方式建模:

:A {ID:"123",Group:"ABC",Family:"XYZ"}
:B {ID:"456",Group:"ABC",Family:"XYZ"})
(:A)-[:SCORE{score:'2'}]-(:B)

请找到随附的图片,以进一步阐明当前数据的外观。enter image description here

现在, 我正在通过具有5列

的CSV文件导入一些新数据
  1. A的ID
  2. B的ID
  3. A与B相连的得分
  4. 家庭

在新数据中,可以有一些新的A标识或一些新的B标识

问题:

  1. 我想创建那些类型为A和B的新节点,并创建一个关系“得分”,并将得分分配为它们之间的关系类型“得分”的值
  2. 有可能A和B之间的现有分数可能已更改。所以我只想用新分数更新以前的分数。

如何使用CSV作为导入来编写密码来解决上述问题。

我第一次使用以下密码查询对数据进行建模:

using periodic commit LOAD CSV WITH HEADERS FROM "file:///ABC.csv" as line Merge(a:A{ID: line.A,Group:line.Group,Family:line.Family})
Merge(b:B{ID: line.A,Group:line.Group,Family:line.Family})
Merge(a)-[:Score{score:toFloat(line.Score)}]-(b)

注意:节点“ A”和“ B”的族和组都相同

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以MERGE关系并在事实之后设置分数,这样它就不会为每个新值创建新的SCORE关系。

USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM "file:///ABC.csv" AS line
MERGE (a:A {ID: line.A, Group:line.Group, Family:line.Family})
MERGE (b:B {ID: line.A, Group:line.Group, Family:line.Family})
MERGE (a)-[score:SCORE]-(b)
SET score.score = toFloat(line.Score)