我有三种节点:me(一个节点)、myFriend、friendOfFriend,我想:
me.
me和myFriend之间创建关系,其中两个属性具有相同的值,
friend和friendOfFriend之间创建关系,其中friend和friendOfFriend具有两个属性相同的值,而friendOfFriend应该排除me和friendOfFriend之间的关系,其中两个属性的值相同,但friendOfFriend应该排除friend.。我对neo4j很陌生,我发现这些文档很难阅读,提供的信息也很少。/例如如何使用基本工具,相反,它详细地写着“是的,我们很好,请资助我们”。无论如何,让我们看看我的需求的伪代码版本:
match (me) where me.a1="Rain"
for i in range(all_nodes):
CONSTANT_ME = [me.a2, me.a3] # <------- How to #1
if i.a2 in CONSTANT_ME:
# create friend relationship between me and i.
for i in range(friend):
CONSTANT_FRIEND = [friend.a2, friend.a3]
for j in range(friend):
if j.a2 in CONSTANT_FRIEND
AND j.a3 in CONSTANT_FRIEND:
# create FF relationship between node i and j我想用Neo4j的Cypher语言写上面的内容,我试过的是:
MATCH (me:Classmate), (c:Classmate)
WHERE ID(me) < ID(c)
AND me.a1="Rain" AND c.a1<>"Rain"
AND ANY(x in [me.a2, me.a3] WHERE x in [c.a2, c.a3])
CREATE (me)-[:friend]->(c);
MATCH (c1:Classmate), (c2:Classmate)
WHERE ID(c1) < ID(c2)
AND c1.a1<>"Rain" AND c2.a1<>"Rain"
AND ANY(x in [c1.a2, c1.a3] WHERE x in [c2.a2, c2.a3])
CREATE (c1)-[:friendOfFriend]->(c2);
MATCH (me:Classmate), (c2:Classmate)
WHERE ID(me) < ID(c2)
AND c1.a1="Rain" AND c2.a1<>"Rain"
AND ANY(x in [me.a2, me.a3] WHERE x in [c2.a2, c2.a3])
CREATE (me)-[:meFF]->(c2);正如你所看到的,这是非常冗长的,我无法阻止:
[me.a2, me.a3]被声明了两次。[:friend]的节点创建[:meFF]最后,有没有人推荐一些关于Neo4j的好教程,其中包括如何解决我遇到的问题?
发布于 2021-06-18 16:22:02
你必须学会不同的想法。图改变了你的世界观!
我,我的朋友,我朋友的朋友都是人。因此,您需要一个节点标签和3个节点链接在一起。尝尝这个
create (p1:Person{name:'Me'})
create (p2:Person{name:'My Friend'})
create (p3:Person{name:'Friend of my Friend'})
merge (p1)-[r1:friend]-(p2)
merge (p2)-[r2:friend]-(p3)然后
match p=(a:Person{name:'Me'})-[r:friend*0..5]->(b:Person) return phttps://stackoverflow.com/questions/68011149
复制相似问题