【问题标题】:Neo4j MERGE creates new nodes instead of using the existing onesNeo4j MERGE 创建新节点而不是使用现有节点
【发布时间】:2017-06-22 22:41:00
【问题描述】:

在数据库中,我有一个标签 Person,其中包含具有以下属性的节点:firstname, gender, lastname, id

我有一个 CSV 文件,其中包含以下关系信息:

id  sibling
1   3,4,5

我要做的是在idsibling 列中的值之间创建关系。

我正在使用以下代码:

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、firstname、gender、lastname和id属性),没有新创建的关系,但是当我尝试返回具有关系的节点时,例如:

MATCH (p:Person)-[SIBLING_OF]-(k:Person)
WHERE p.id='123
RETURN p,k

返回新创建的k 节点,它只有id 属性。

有人知道我在查询中做错了什么吗?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我希望您的 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)
    

    【讨论】:

    • 正如您所建议的,问题出在 CSV 文件中的空白处。删除它可以解决问题。使用您的查询创建了与新空节点的关系(它们没有任何属性)。使用我提供的查询完成了工作。
    • 抱歉 - 我不小心将 p 留在了 WITH 子句之外,这会导致空节点。你的版本真的是真的不必要地多次匹配id 列(对于每个兄弟),而它只需要做一次。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-26
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    相关资源
    最近更新 更多