我正在为我的项目使用Neo4j。
在我的图表数据库中,我有两种类型的节点:
人员节点可以与关系朋友相互连接 人节点如果喜欢那种水果就与水果节点相连。
我想找到一组喜欢苹果桃子和橙子的3人组,并且至少有一个人从第三人到第三人的路径"朋友"或者所有3个人都是朋友
由于我最近刚开始使用neo4j,我需要Guru的帮助来提出解决方案。
我的意思是:
找出喜欢苹果的人群 找出喜欢桃子的人群 找出喜欢橙色的人群
从这3组中找出现有的node-rel-node-rel ...路径,该路径从其中一个集合开始,经过第二个集合,最终以第三个结束。
请您确认我的方法是否正确和最佳,是否可以通过Cypher或py2neo实现?
无法找到共享的方式,但可以在此处粘贴查询。 如果您将其粘贴回console.neo4j.org,您将获得一个图表:
CREATE (Neo { name:'Neo' }),(Morpheus { name: 'Morpheus' }),(Trinity { name: 'Trinity' }),(Cypher { name: 'Cypher' }),(Apple { fruit: 'Apple' }),(Peach { fruit: 'Peach' }),(Banana { fruit:'Banana' }), root-[:ROOT]->Neo, Neo-[:KNOWS]->Morpheus, Neo-[:KNOWS]->Trinity, Morpheus-[:KNOWS]->Cypher, Neo-[:LIKES]->Peach, Trinity-[:LIKES]-Banana, Morpheus-[:LIKES]-Apple
假设您在提及的网站中看到该模型。所以在这里我需要搜索那些喜欢(Peach,Banana,Apple)的人我希望得到Neo,Trinity和Morpheus,因为Neo喜欢桃子,Trinity喜欢香蕉,而Morpheus喜欢苹果,他们以某种方式连接(Neo知道两者Morpheus和Trinity,即使Trinity也不知道Morpheus。)
我的数据库中将有10万人,每个人都与一些人和他们喜欢的水果联系在一起。我想继续描述搜索并获得所有可能的匹配,如Neo,Morpheus和Trinity。希望这个描述更加清晰。
答案 0 :(得分:1)
尝试查看此查询是否符合您的要求。它检索3个人的组,每个人都喜欢一种具有给定名称的水果,并且它们通过一种或两种关系相互连接[:知识]。不确定它是否会很好地扩展。
Match p1:Person-[:LIKES]->f1:Fruit, p2:Person-[:LIKES]->f2:Fruit, p3:Person-[:LIKES]->f3:Fruit, path1=p1-[:KNOWS*1..2]-p2, path2=p2-[:KNOWS*1..2]-p3,path3=p1-[:KNOWS*1..2]-p3
Where f1.name = 'Apple' and f2.name='Peach' and f3.name = 'Banana' and all(n in nodes(path1) where n in [p1,p2,p3]) and all(n in nodes(path2) where n in [p1,p2,p3]) and all(n in nodes(path3) where n in [p1,p2,p3])
Return p1.name, p2.name, p3.name
注意:我已经为每个水果节点添加了一个标签“:Fruit”,并为每个人节点添加了一个标签“:Person”。
以下是图表和查询的控制台