在数据库中,我有一个标签Person
其中包含具有属性的节点:firstname, gender, lastname, id
。
我有一个包含关系信息的 CSV 文件,例如:
id sibling
1 3,4,5
我试图做的是在id
和sibling
列中的值之间创建关系。
我使用以下代码来执行此操作:
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM
'file:///relationship.csv' AS line1
WITH line1, split(line1.sibling, ",") as siblings
UNWIND siblings as sibling
MERGE (p:Person{id:line1.id})
MERGE (k:Person{id:sibling})
MERGE (p)-[:SIBLING_OF]->(k)
但是此方法创建仅具有id
属性的新节点,而不是连接数据库中已存在的节点。
奇怪的是当我使用此查询时:
MATCH (p:Person)
WHERE p.id='123'
RETURN p
它只返回以前在数据库中的节点(包含 id、名字、性别、姓氏和 id 属性(,没有新创建的关系,但是当我尝试返回具有关系的节点时,例如:
MATCH (p:Person)-[SIBLING_OF]-(k:Person)
WHERE p.id='123
RETURN p,k
新创建的k
节点将返回仅具有id
属性。
有谁知道我在查询中做错了什么?
我希望您的CSV文件中有一些空白区域,以防止密码与原始节点匹配。
确保对 :Person(id)
有约束或索引。
另外,您正在合并该用户的每个兄弟姐妹的id列,您可以将其向上移动并且只执行一次。
USING PERIODIC COMMIT
LOAD CSV WITH HEADERS FROM 'file:///relationship.csv' AS line1
MERGE (p:Person {id: trim(line1.id)})
WITH p, line1, split(line1.sibling, ",") as siblings
UNWIND siblings as sibling
MERGE (k:Person {id: trim(sibling)})
MERGE (p)-[:SIBLING_OF]->(k)