我正在使用Neo4j构建一些测试应用程序。我想模拟小型社交网络并试图找到:
- 用户X的所有朋友
- 喜欢啤酒的用户X朋友的朋友
醇>
我坚持建模“知道”关系。让3个用户A,B和C.仅仅定义它们之间的一个关系就足够了。
A知道B
B知道C
或者我必须建立'双向'关系并明确提供
A知道B所以B知道A
B知道C所以C知道B
它会增加关系的数量,但可能需要它。
同样的问题与喜欢的饮料有关。
我应该定义吗?A喜欢啤酒
A 喜欢啤酒
答案 0 :(得分:4)
如果你想区分知识b和b知道a,那么你需要有两种关系。否则,在查询时,您可以通过省略方向轻松获得两者。
同样,在喜欢啤酒的情况下,你真的只需要定义一个方向。
一个真实的例子:连接是互相的facebook / linkedin模型只需要一个方向/关系,但是一个人可以跟随另一个人的推特模型(但另一个人不必跟随他们),你需要两个关系 - 每个方向一个。
使用一些查询示例进行更新:
CREATE
(joe {name:"Joe"}),
(jim {name:"Jim"}),
(bob {name:"Bob"}),
(beer {name:"Beer"}),
joe-[:friends_with]-jim,
joe-[:friends_with]-bob,
bob-[:likes]->beer;
对于朋友们:
START person=node:node_auto_index(name="Joe")
MATCH (person)-[:friends_with]-(friend)
RETURN person, friend;
喜欢啤酒的朋友们:
START person=node:node_auto_index(name="Joe"), beer=node:node_auto_index(name="Beer")
MATCH (person)-[:friends_with]-(friend)-[:likes]->(beer)
RETURN person, friend, beer;