Cypher - 添加节点之间的关系并添加节点(如果它们不存在)

时间:2013-06-08 23:46:47

标签: neo4j cypher

我正在尝试执行以下Cypher查询:

CREATE UNIQUE (
event:Event { 
    id : '94ECE7BE-882C-446B-94FE-9348E0DF5E08', 
    startTimestamp : 1370821057.000000, 
    endTimestamp : 1370907457.000000, 
    type : 2, 
    category : 1,
    privacy : 1,
    dressCode : 4 
}), 
event<-[:CREATOR]-(creator:User { 
    id : '55A1CA51-9489-41E1-8083-EC23E974E604', 
    type : 1, 
    email : 'something@gmail.com' 
});

除了我得到的是有点烦人的错误信息:

Think we should have better error message here? Help us by sending this query to cypher@neo4j.org.

此查询有什么问题?

由于

1 个答案:

答案 0 :(得分:1)

create unique需要一种关系来锚定你的模式。我假设出于性能原因,因为验证数据库中没有节点与查询中的节点匹配会有问题。此外,您的查询在每次执行中都会创建一个新的用户节点,这可能不是您想要的。

如果您有现有的创建者节点(例如,只有已知用户可以添加事件),您可以将其作为起点:

match creator:User where creator.id='unique' 
CREATE UNIQUE (
event:Event { 
    id : '94ECE7BE-882C-446B-94FE-9348E0DF5E08', 
    startTimestamp : 1370821057.000000, 
    endTimestamp : 1370907457.000000, 
    type : 2, 
    category : 1,
    privacy : 1,
    dressCode : 4 
})<-[:CREATOR]-(creator) 

下一个2.0里程碑可能会对类型添加唯一约束。

如果您确实想要创建新的creator节点,一种解决方法是将所有事件附加到专用锚点,但这将为您提供一个密集节点,可以减慢查询的速度:

start n=node(0) CREATE UNIQUE n-[r:FOO]- (
event:Event { 
    id : '94ECE7BE-882C-446B-94FE-9348E0DF5E08', 
    startTimestamp : 1370821057.000000, 
    endTimestamp : 1370907457.000000, 
    type : 2, 
    category : 1,
    privacy : 1,
    dressCode : 4 
})<-[:CREATOR]-(creator:User { 
    id : '55A1CA51-9489-41E1-8083-EC23E974E604', 
    type : 1, 
    email : 'something@gmail.com' 
}) return event, creator

所以最好不要那样做。