Neo4j 如何在CSV导入期间关联到不同的节点

Neo4j 如何在CSV导入期间关联到不同的节点,neo4j,cypher,Neo4j,Cypher,我有一个疑问: LOAD CSV WITH HEADERS FROM 'file:///attributes.csv' AS line MATCH (p:Property {old_id: line.property_id}) MERGE (a:Attribute {description: line.description})-[:ATTRIBUTE_OF {old_id: line.id, value: line.value}]->(p) 对于每一新行,当描述相同时,我尝试合并属性,

我有一个疑问:

LOAD CSV WITH HEADERS FROM 'file:///attributes.csv' AS line
MATCH (p:Property {old_id: line.property_id})
MERGE (a:Attribute {description: line.description})-[:ATTRIBUTE_OF {old_id: line.id, value: line.value}]->(p)
对于每一新行,当描述相同时,我尝试合并属性,但与已匹配的属性节点建立新关系

我遇到的问题是,现有的关系正在被新的关系所取代


我如何确保维护所有以前创建的关系,并且只创建新的关系?

您可以尝试分两步执行:

  • 首先,
    MERGE
    line.description
    相同时的属性
  • 然后,
    a
    p
    节点之间创建一个新关系
  • 示例查询:

    LOAD CSV WITH HEADERS FROM 'file:///attributes.csv' AS line
    MATCH (p:Property {old_id: line.property_id})
    MERGE (a:Attribute {description: line.description})
    CREATE (a)-[:ATTRIBUTE_OF {old_id: line.id, value: line.value}]->(p)
    

    我会这样处理:

    LOAD CSV WITH HEADERS FROM 'file:///attributes.csv' AS line
    MATCH (p:Property {old_id: line.property_id})
    OPTIONAL MATCH (:Attribute {description: line.description})-[r:ATTRIBUTE_OF {old_id: line.id, value: line.value}]->(p)
    WHERE r IS NULL
    CREATE (:Attribute {description: line.description})-[:ATTRIBUTE_OF {old_id: line.id, value: line.value}]->(p)
    

    这可能与Bruno Peres的解决方案中的查询稍有不同——请检查并报告对您的案例有效的查询。

    对关系进行可选匹配,并使用WHERE。。。如果关系不存在,则不为NULL。(抱歉,无法提供示例,因为我现在只有一部手机。)如果您有时间(和电脑),我很想看一个示例,因为我对这方面还很陌生。谢谢:)我补充了我的答案。另外,我建议你看看GraphAware的帖子。另一个答案很有效,但谢谢你的投入,我现在对Cypher了解多一点了!:DI没有意识到我可以在一条指令中进行合并和创建,感谢指针。