【问题标题】:Redundancy of graph in Neo4jNeo4j中图形的冗余
【发布时间】:2014-08-18 21:12:34
【问题描述】:

我在 Neo4j 中创建了一个小图,并创建了相应的节点和关系。如果我再次运行相同的代码,则会再次创建节点和关系,而不是像 Oracle 那样显示节点和关系已经存在的消息。

MERGE (a:Person1 { name : 'ROGER', title : 'Developer', age :28})  
MERGE (b:Person2 { name : 'Britney', title : 'financier',age :32})  
MERGE (c:Person3 { name : 'Christian', title : 'tester',age :24}) 
Create (a)-[:HUSBAND{last_name:'WHITE'}]->(b) RETURN a,b,c;

所以我想澄清一下 Neo4j 是否有重复或节点会被创建多次

提前谢谢...

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    作为参考,MERGE 语句不是创建新人,只有你的 CREATE 语句在最后,请参阅http://console.neo4j.org/r/qrzr6u 在重新执行时说

    created 1 relationship set 1 property
    

    您可能希望所有语句都使用 MERGE:

    MERGE (a:Person1 { name : 'ROGER', title : 'Developer', age :28 })
    MERGE (b:Person2 { name : 'Britney', title : 'financier', age :32 })
    MERGE (c:Person3 { name : 'Christian', title : 'tester', age :24 })
    MERGE (a)-[:HUSBAND { last_name:'WHITE' }]->(b)
    RETURN a,b,c;
    

    有关示例,请参阅 http://console.neo4j.org/r/vmfl2v

    【讨论】:

      【解决方案2】:

      MERGE 不会重新创建已经存在的数据。 CREATE 总是创建数据,即使它已经存在。

      The documentation on merge 指出它总是匹配完整的模式。

      对于您提供给我们的 cypher sn-p,如果您运行两次,您最终应该只会得到一份 Roger、Britney 和 Christian,但我希望 Roger 和 Britney 之间有两个独立的关系,因为CREATE 总是在创造。

      注意MERGE 上的问题,但它总是会合并到您指定的完整模式上。例如,如果你这样做:

      MERGE (a:Person {fname: "Henry"});
      MERGE (a:Person {fname: "Henry", lname: "Banks"});
      

      然后你得到两个亨利,一个没有 lname 属性,一个有。这是因为第二个MERGE 查找具有 fname:Henry, lname:Banks 的 Person 节点但找不到它,因此它创建了一个。它确实向现有节点添加额外的属性。这是使用 MERGE 的常见故障。

      另一个使用 MERGE 的常见错误(同样是由于“整个模式匹配”)是这样的:

      MERGE (a:Person {name:"Henry"})-[:knows]->(b:Person {name: "Mary"});
      MERGE (a:Person {name:"Henry"})-[:married]->(b:Person {name: "Mary"});
      

      这最终创建了两个亨利和两个玛丽。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多