如何使用 Neo4j Cypher 创建带有唯一约束的关系?
CONSTRAINT
,并且这是唯一的类型:UNIQUENESS 约束。该链接引用了内部API的内容,您会发现目前只有一种类型。
这使您可以断言节点的某个属性必须是唯一的,但它不涉及关系。我认为不可能限制各种节点的关系。
Create Unique
! - Kail如果我正确理解了您的问题,您想强制执行某种关系的唯一性,而不是关系某个属性的唯一性。如果这就是您想要的,那么您可以使用“CREATE UNIQUE”来强制实现这种唯一性:
MATCH (root { name: 'root' })
CREATE UNIQUE (root)-[:LOVES]-(someone)
RETURN someone
CREATE_UNIQUE
无效,但您可以使用链接中列出的有效的 MERGE
替代方案。请注意,这更像是一种解决方法,因为它实际上并没有在节点和关系之间创建约束,而只是允许您在查询级别创建唯一的节点关系对。这意味着您必须小心不要意外创建应该是唯一的重复关系。 - JohnCREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day)
http://neo4j.com/docs/developer-manual/current/cypher/#query-constraints-prop-exist-rels
MERGE
来获得类似的行为。过去您可以使用CREATE UNIQUE
来实现这一点,但现在已被弃用,但是CREATE UNIQUE
文档here有一个很好的介绍部分,涵盖了详细信息并展示了如何使用非弃用的MERGE
方式进行替代。MERGE
在查询中创建唯一节点和关系。此外,由于这种唯一性是在查询级别而不是约束级别上决定的,因此您应该非常小心,以免在本应是唯一的地方意外创建重复数据。CREATE UNIQUE
文档部分及MERGE
替代方法放在这里,以防它们消失。)MERGE (p:Person {name: 'Joe'})
RETURN p
MATCH (a:Person {name: 'Joe'})
CREATE UNIQUE (a)-[r:LIKES]->(b:Person {name: 'Jill'})-[r1:EATS]->(f:Food {name: 'Margarita Pizza'})
RETURN a
MATCH (a:Person {name: 'Joe'})
CREATE UNIQUE (a)-[r:LIKES]->(b:Person {name: 'Jill'})-[r1:EATS]->(f:Food {name: 'Banana'})
RETURN a
MERGE (p:Person {name: 'Joe'})
RETURN p
MATCH (a:Person {name: 'Joe'})
MERGE (b:Person {name: 'Jill'})
MERGE (a)-[r:LIKES]->(b)
MERGE (b)-[r1:EATS]->(f:Food {name: 'Margarita Pizza'})
RETURN a
MATCH (a:Person {name: 'Joe'})
MERGE (b:Person {name: 'Jill'})
MERGE (a)-[r:LIKES]->(b)
MERGE (b)-[r1:EATS]->(f:Food {name: 'Banana'})
RETURN a
在Neo4j社区版2.3.1中,似乎没有关系上的约束。
neo4j-sh (?)$ schema ls
Indexes
ON :RELTYPE(id) ONLINE (for uniqueness constraint)
Constraints
ON (reltype:RELTYPE) ASSERT reltype.id IS UNIQUE
你可以轻松地创建多个类型为RELTYPE且具有相同id的关系,无论是全局还是在相同节点之间。MATCH (s:Person {name:"foo"}), (t:Target {name:"target"})
CREATE (s)-[r:RELTYPE {id:"baz"}]-(t)
这个约束似乎只适用于节点,我在Neo4j文档中没有找到任何提到这种关系的内容。
http://neo4j.com/docs/stable/rest-api-schema-constraints.html
我希望看到的(但根据我阅读的Neo4J文档,目前不可能)是限制(例如)ACTED_IN关系:
(:Person)-[ACTED_IN]->(:Movie)
以防止错误的关系:
(:Movie)-[ACTED_IN]->(:Person)
显然,你可以通过这种方式找到错误的反向关系,但最好通过约束来防止它发生:
match((m:Movie)-[:ACTED_IN]->(p:Person)) return m,p