【问题标题】:Create node with unique relationships in Neo4j在 Neo4j 中创建具有唯一关系的节点
【发布时间】:2013-06-16 13:47:38
【问题描述】:

我是一个新手 Neo4j 用户,正在尝试使用 Neo4j Milestone 2.0.0-M03 进行学习。我正在尝试创建唯一的节点,而不是通过它们拥有的属性,而是通过它们拥有的关系。

我创建了一个数据库:

MERGE (p:Person { name : 'Bill' })
MERGE (p:Person { name : 'Ben' })
MERGE (p:Person { name : 'Bob' })

然后我与成员 Bill 和 Ben 创建一个“团队”:

MATCH bill:Person, ben:Person  
WHERE bill.name='Bill' AND ben.name='Ben' 
CREATE UNIQUE t:Team-[:HAS_MEMBER]->bill, t:Team-[:HAS_MEMBER]->ben

然后我想创建一个由 Bill 和 Bob 成员组成的第二个团队,但是执行与上述相同的操作,即:

MATCH bill:Person, bob:Person  
WHERE bill.name='Bill' AND bob.name='Bob' 
CREATE UNIQUE t:Team-[:HAS_MEMBER]->bill, t:Team-[:HAS_MEMBER]->bob

这使得将 Bob 添加到现有团队的变化最小。因此,我有一个包含 Bill、Ben 和 Bob 的团队,但我想要两个团队,他们的成员都是独一无二的。

鉴于“CREATE UNIQUE”的语义,我很欣赏这是正确的。不幸的是,我无法找出正确的语句来创建由其拥有的成员唯一标识的第二个团队节点。

我不希望将属性放在区分它们的团队上,我希望团队节点通过它们的关系而不是它们的属性来唯一标识。

我可以创建双重关系“OMITS_MEMBER”,当且仅当 HAS_MEMBER 不存在时,该关系存在于团队和个人之间。这似乎增加了一个不需要的数据库约束。

鉴于我可以在没有团队属性或双重关系的情况下用图论数学表达这种事情,我相信开发 Neo4j 的聪明人有办法做到这一点。我正在努力弄清楚。

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    在这种情况下,您可能不应该使用CREATE UNIQUE,而应该只使用CREATE。如果您要添加成员的是现有团队,请使用CREATE UNIQUE

    【讨论】:

    • 感谢您的回复。我不希望创建重复的团队(由他们的成员确定)。如果我理解正确,CREATE 会插入一个副本。
    • 我可以先查询现有团队。也许我被CREATE UNIQUEMERGE 的用处所吸引,期待类似的东西也适用于此。
    • 我不确定您的不同情况。您如何知道这是一个新团队,还是您正在向现有团队添加成员?在某些时候,您必须知道自己想要哪个。
    【解决方案2】:

    也许放弃唯一但检查正在创建的团队是否会是唯一的?类似的东西:

    MATCH bill:Person, bob:Person
    WHERE bill.name='Bill' AND bob.name='Bob' 
    and not bill-[:HAS_MEMBER*2]-bob
    CREATE t2:Team-[:HAS_MEMBER]->bill, t2:Team-[:HAS_MEMBER]->bob
    

    这当然几乎肯定不会涵盖所有情况,并且可能难以编码

    【讨论】:

      【解决方案3】:

      您希望拥有的每个团队都是节点,因此在您的程序中的某个时刻,您需要跟踪这些节点。即使您坚持让团队没有属性,他们仍然会有节点 ID。所以以下应该工作:

      • 创建一个团队并获取其节点 ID(假设它返回 5)

        CREATE (t:Team) RETURN ID(t)
        
      • 然后将您的成员添加到团队中

        START t=node(5)
        MATCH bill:Person, ben:Person
        WHERE bill.name='Bill' AND ben.name='Ben' 
        CREATE t-[:HAS_MEMBER]->bill, t-[:HAS_MEMBER]->ben
        

      我认为您也可以使用 WITH 语句组合这些调用,但我没有尝试过。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-24
        • 2016-05-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-28
        • 1970-01-01
        相关资源
        最近更新 更多