我是一个尝试使用Neo4j Milestone 2.0.0-M03学习的菜鸟Neo4j用户。我尝试创建唯一的节点,而不是通过它们拥有的属性,而是通过它们之间的关系来创建。
我创建了一个数据库:
MERGE (p:Person { name : 'Bill' })
MERGE (p:Person { name : 'Ben' })
MERGE (p:Person { name : 'Bob' })
然后我创建了一个团队'与会员比尔和本:
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添加到现有团队的最小变化。因此,我有一个包含比尔,本和鲍勃的团队,但我想要两个由其成员独有的团队。
鉴于' CREATE UNIQUE'的语义,我理解这是正确的。不幸的是,我无法找出正确的语句来创建由其拥有的成员唯一标识的第二个团队节点。
我不希望将属性放在区分它们的团队上,我希望团队节点能够通过它们的关系而不是它们的属性进行唯一标识。
我可以创建双重关系' OMITS_MEMBER',当且仅当HAS_MEMBER不存在时,才会出现在团队和个人之间。这似乎增加了一个不受欢迎的数据库约束。
鉴于我可以在图论的数学中表达这种没有团队属性或双重关系的东西,我确信开发Neo4j的聪明人有办法做到这一点。我正在努力解决这个问题。
答案 0 :(得分:1)
在这种情况下,您可能不应该使用CREATE UNIQUE
,而只是使用CREATE
。如果您要将成员添加到现有团队,请使用CREATE UNIQUE
。
答案 1 :(得分: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
这当然几乎肯定不会涵盖所有情况,并且编码可能很棘手
答案 2 :(得分: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
语句合并这些调用,但我还没有尝试过。