0

我正在为我的项目使用 Neo4j。

在我的图形数据库中,我有两种类型的节点:

  1. 水果

人节点可以通过关系相互连接,如果他们喜欢水果,人节点就会与水果的节点连接。

我想找到一组 3 人喜欢例如苹果桃和橙子,并且至少有从一个人到第三个与“朋友”关系的路径,或者所有 3 个都是朋友。

由于我最近才开始使用 neo4j,因此需要 Guru 的帮助来提出解决方案。

我的想法是:

找出喜欢苹果的人群 找出喜欢桃子的人群 找出喜欢橙子的人群

从这 3 个集合中找出现有的 node-rel-node-rel... 路径,从其中一个集合开始,经过第 2 个集合,以第 3 个结束。

您能否确认我的方法是否正确和最优,是否可以通过 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 喜欢 peach,Trinity 喜欢香蕉,Morpheus 喜欢苹果,并且它们以某种方式连接(Neo 两者都知道墨菲斯和三位一体,即使三位一体都不认识墨菲斯)。

我的数据库中将有 10 万人,每个人都与某些人以及他们喜欢的水果联系在一起。我想继续进行描述的搜索并获得所有可能的匹配项,例如 Neo、Morpheus 和 Trinity。希望这个描述更清楚。

4

1 回答 1

1

试试看这个查询是否满足您的要求。它检索 3 个人的组,每个人都喜欢一种具有给定名称的水果,并且他们通过一两个关系 [:KNOWS] 相互连接。不确定它是否会很好地扩展。

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”。

这是图表和查询的控制台,

http://console.neo4j.org/?id=fswj2b

于 2013-09-30T14:22:11.533 回答