创建一个唯一的节点,表示与Neo4j中其他节点的复杂关系

时间:2013-12-05 22:44:58

标签: merge neo4j unique relationship cypher

模型

我有Cinema s,Film和用户,我希望将View关系建模为图表的头等公民,例如:" Me 去看电影#58 观看电影#43483 ",将来我可能想在 上添加" 2013 "或者"与 friend1 friend2 "到View"关系",例如:

CREATE
(u1:User {id:1}),
(u2:User {id:2}),
(f1:Film {id:1}),
(f2:Film {id:2}),
(c1:Cinema {id:1}),
(c2:Cinema {id:2}),
// (v:View), (u1)-[:ATTENDED]->(v),(c1)<-[:AT]-(v),(v)-[:WATCHED]->(f1)

我一直试图弄清楚如何制作一个独特的View(即一个人无法在同一个电影院看过同一部电影两次[这里有额外约会关系的地方] in])查询如果运行两次,则不会创建重复的View节点。

使用CREATE UNIQUE取1

MATCH (c:Cinema {id:1}), (f:Film {id:1}), (u:User {id:1})
CREATE UNIQUE (v:View),
    (u)-[:ATTENDED]->(v),
    (c)<-[:AT]-(v),
    (v)-[:WATCHED]->(f)
return v, u, c, f

http://console.neo4j.org/r/xcu90c 似乎不支持创建唯一的节点和关系。

使用CREATE UNIQUE需要2

如果我删除单独的节点创建,它会有效,直到我不创建第二个视图: http://console.neo4j.org/r/x15bk1

使用MERGE

MATCH (c:Cinema {id:1}), (f:Film {id:1}), (u:User {id:1})
MERGE (u)-[:ATTENDED]->(v:View), (c)<-[:AT]-(v), (v)-[:WATCHED]->(f)
return v, u, c, f

文档说您可以使用MERGE创建路径,但看似只有直线路径...上面给出了逗号的语法错误。

所以基本上我不希望节点是唯一的(View没有任何属性),我想让节点的关系变得独一无二。请提出解决方案。

失去希望

我对可能的解决方法的看法是(如果一切都失败了):

  • 在View节点上复制cinemaID,filmID和userID,并对该
  • 设置唯一约束
  • 忽略原子性,只需在不同的查询中查询,检查和创建节点/关系

到目前为止,我对neo4j并没有留下深刻的印象,所以很多事情都没有用。

2 个答案:

答案 0 :(得分:0)

我认为这是对你的模式中孤独的(v:View)片段的抨击1.试试这个:

MATCH (c:Cinema { id:58 }),(f:Film { id:43483 }),(u:User { name:"twister" }) 
CREATE UNIQUE (u)-[:ATTENDED]->(v:View),(c)<-[:AT]-(v:View),(v:View)-[:WATCHED]->(f) 
RETURN v, u, c, f

答案 1 :(得分:0)

你可以尝试使用多个MERGE语句,对我有用:

MATCH (c:Cinema {id:1}), (f:Film {id:1}), (u:User {id:1})
MERGE (u)-[:ATTENDED]->(v:View)
MERGE (c)<-[:AT]-(v)
MERGE (v)-[:WATCHED]->(f)
RETURN v, u, c, f