2

我是一个新手 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 的聪明人有办法做到这一点。我正在努力弄清楚。

4

3 回答 3

1

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

于 2013-06-16T15:32:56.947 回答
0

也许放弃唯一但检查正在创建的团队是否会是独一无二的?沿着这些思路:

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

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

于 2013-06-27T17:30:55.460 回答
0

您希望拥有的每个团队都是节点,因此在您的程序中的某个时刻,您需要跟踪这些节点。即使您坚持让团队没有属性,他们仍然会有节点 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语句组合这些调用,但我还没有尝试过。

于 2013-06-29T12:56:12.110 回答