我在我的项目中使用Neo4j。
在我的图DB中,我有两种类型的节点:
人节点可以通过关系连接,朋友,人节点与水果节点连接,如果他们喜欢的话。
我想找一组三人喜欢的人,比如苹果、桃子和橘子,至少有路从一个人到第三个亲戚“朋友”,或者所有三个人都是朋友。
由于我最近才开始使用neo4j,我需要Guru的帮助才能找到解决方案。
我的想法是:
找出喜欢苹果的人,找出喜欢桃子的人,找出喜欢橘子的人。
从这3组中找出现有的节点-rel-节点-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
假设你在提到的网站上看到了模型。所以在这里我需要搜索喜欢的人(桃子,香蕉,苹果),因此我想要得到新,三一和墨菲斯,因为新喜欢桃子,三一喜欢香蕉和墨菲斯喜欢苹果,他们之间有某种联系( Neo同时知道墨菲斯和三位一体,甚至tho三位一体也不知道墨菲斯)。
我的数据库里会有100,000人,每个人都和一些人和他们喜欢的水果联系在一起。我想继续描述搜索,得到所有可能的比赛,如尼欧,墨菲斯和三一。希望这个描述更清楚。
发布于 2013-09-30 14:22:11
尝试并查看此查询是否满足您的要求。它检索三个人组成的组,每个人都喜欢一种具有给定名称的水果,他们通过一两种关系相互连接:知道。不确定它的规模会有多大。
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注意:我在每个水果节点添加了一个标签“:果树”,给每个人节点添加了一个标签": person“。
这是图表和查询的控制台,
http://console.neo4j.org/?id=fswj2b
https://stackoverflow.com/questions/18917450
复制相似问题