如何通过 neo4j cypher创建关系的唯一CONSTRAINT?
答案 0 :(得分:4)
目前,只有一种CONSTRAINT
neo4j可以让你创建,而UNIQUENESS约束。该链接引用了内部API中的内容,您会注意到目前只有一种类型。
Here's a link on how to create a uniqueness constraint
这使您可以断言节点的某个属性必须是唯一的,但它并没有说出关系的任何信息。我认为不可能限制各种节点之间的关系类型。
答案 1 :(得分:2)
如果我理解你的问题,你想要强制某种关系的唯一性,而不是关系的某些属性的唯一性。如果这就是你想要的,那么你可以使用“CREATE UNIQUE”强制执行这种唯一性:
MATCH (root { name: 'root' })
CREATE UNIQUE (root)-[:LOVES]-(someone)
RETURN someone
答案 2 :(得分:1)
与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
答案 3 :(得分:0)
似乎关系约束只能强制存在关系属性而不能实现其唯一性
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Intent intent=new Intent(SplashActivity.this, LoginActivity.class);
SplashActivity.this.startActivity(intent);
SplashActivity.this.finish();
}
}, 3000);
http://neo4j.com/docs/developer-manual/current/cypher/#query-constraints-prop-exist-rels
答案 4 :(得分:0)
尽管您还不能作为约束来执行此操作,但是可以使用以下变通方法通过在查询中使用MERGE
在查询级别(而不是约束级别)获得类似的行为。您曾经可以使用CREATE UNIQUE
来执行此操作,但此操作已被弃用,但是CREATE UNIQUE
文档here的简介很好,详细介绍了详细内容并向您展示如何以不推荐使用的MERGE
方式进行替换。
因此,您可以使用这些文档来了解如何使用MERGE
通过查询创建唯一的节点和关系。另外,由于这种唯一性是在查询级别而不是约束级别决定的,因此在意外创建重复数据的地方应该非常谨慎。
(我将上面为CREATE UNIQUE
提供的当前相关文档部分与MERGE
的替代项一起放在此处,以防它们消失。)
CREATE UNIQUE
位于MATCH
和CREATE
的中间,它会匹配所能找到的内容并创建丢失的内容。在以下示例中,我们说明如何使用
MERGE
来表达CREATE UNIQUE
对于节点和关系所保证的相同级别的唯一性。假设原始查询集由:
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
这将创建两个
:Person
节点,它们之间的:LIKES
关系以及从:EATS
节点之一到两个:Person
节点的两个:Food
关系。没有节点或关系重复。以下一组查询(使用
MERGE
()将获得相同的结果:
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
我们注意到,所有这些查询也可以合并为一个更大的查询。
下面的
CREATE UNIQUE
示例使用下图:
答案 5 :(得分:0)
我想看到的(但目前无法读取Neo4J documentation)是限制(例如)ACTED_IN关系:
(:Person)-[ACTED_IN]->(:Movie)
防止错误关系:
(:Movie)-[ACTED_IN]->(:Person)
很显然,您可以通过这种方式找到不良的向后关系,但是最好避免出现约束条件:
match((m:Movie)-[:ACTED_IN]->(p:Person)) return m,p