你可以在存在约束的属性上使用MERGE和ON CREATE SET吗?

问题描述:

由于只有neo4j的企业版支持存在约束,所以我无法自己测试。你可以在存在约束的属性上使用MERGE和ON CREATE SET吗?

作为一个例子,假设我在关系属性上有一个存在约束:Likes(createDate),通常在以下情况下使用:Person喜欢另一个人。

显然,这样的创建调用将失败,因为存在约束:

MATCH (a:Person{id:1}), (b:Person{id:2}) 
CREATE (a)-[:Likes]->(b) 

我会创建一个CREATEDATE财产的关系遵守约束。

但是,如果关系已经存在呢?我想要做这样的事情:

MATCH (a:Person{id:1}), (b:Person{id:2}) 
MERGE (a)-[v:Likes]->(b) 
ON CREATE SET v.createDate = timestamp() 

我担心这样会不会被允许的,但我不知道是否存在约束是否在MERGE的时间检查,或开启后创建。看起来这将是一个相当标准的用例,我想知道企业版是否允许这个没有问题。

是,Neo4j的检查ON CREATE后的节点的状态已经调用了它是完整的:

neo4j-sh (?)$ CREATE CONSTRAINT ON()-[r:Likes]-() ASSERT exists(r.createDate); 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Property existence constraints added: 1 
212 ms 
neo4j-sh (?)$ CREATE (a:Person {uid: 1}), (b:Person {uid: 2}); 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Nodes created: 2 
Properties set: 2 
Labels added: 2 
63 ms 
neo4j-sh (?)$ MATCH (a:Person {uid: 1}), (b:Person {uid: 2}) MERGE (a)-[r:Likes]->(b); 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Relationships created: 1 
41 ms 
ConstraintViolationException: Relationship 1398105 with type "Likes" must have the property "createDate" due to a constraint 
neo4j-sh (?)$ MATCH (a:Person {uid: 1}), (b:Person {uid: 2}) MERGE (a)-[r:Likes]->(b) ON CREATE SET r.createDate = timestamp(); 
+-------------------+ 
| No data returned. | 
+-------------------+ 
Relationships created: 1 
Properties set: 1 
43 ms 

我使用的Neo4j企业版3.0.3。

+0

完美。谢谢! – InverseFalcon