如何通过neo4j cypher为关系创建唯一的CONSTRAINT?

时间:2014-05-12 13:35:47

标签: neo4j unique unique-constraint

如何通过 neo4j cypher创建关系的唯一CONSTRAINT?

6 个答案:

答案 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

The Neo4j Manual: Create unique relationships

答案 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位于MATCHCREATE的中间,它会匹配所能找到的内容并创建丢失的内容。

     

在以下示例中,我们说明如何使用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示例使用下图:

enter image description here

  

---来源:Cypher Manual v3.5: Section 3.18, Introduction

答案 5 :(得分:0)

我想看到的(但目前无法读取Neo4J documentation)是限制(例如)ACTED_IN关系:

(:Person)-[ACTED_IN]->(:Movie)

防止错误关系:

(:Movie)-[ACTED_IN]->(:Person)

很显然,您可以通过这种方式找到不良的向后关系,但是最好避免出现约束条件:

match((m:Movie)-[:ACTED_IN]->(p:Person)) return m,p