我正在使用Neo4j来查找用户之间的连接程度。我有跟随者形状的数据:
(user)-[:INTERACTS_WITH]->(user)
因此,如果user_1与user_2交互且user_2与user_3交互,则user_1和user_3共享二级连接。
理想情况下,我希望得到以下数据集作为回报:
degree count
NULL 123
1 1050
2 3032
3 2110
... ...
有没有更好的方法来做到这一点,而不是简单地为每对用户运行shortestPath()函数?如果没有,那么在Neo4j中循环用户的最佳方法是什么?
另外,我想方向在这里起作用,所以你建议将这种关系设为双向,这样对于每个(user1)-[:INTERACTS_WITH]->(user2)
我也会创建反向关系(user2)-[:INTERACTS_WITH]->(user1)
吗?
如果您有关于如何创建上述数据集的任何提示,请告诉我们。
非常感谢!
答案 0 :(得分:1)
有没有更好的方法来执行此操作而不是简单地运行shortestPath() 每对用户的功能?如果没有,那么最好的方法是什么 在Neo4j中循环用户?
我相信为每对用户运行shortestPath()
是一个不错的选择,但请记住它应该非常昂贵。
另外,我想方向在这里起作用,你也一样 建议使这种关系双向,以便每一个
(user1)-[:INTERACTS_WITH]->(user2)
我也会反过来 关系(user2)-[:INTERACTS_WITH]->(user1)
?
不,你不需要另一种关系。请记住,在Neo4j中查询时可以忽略关系方向。在建模自然双向的关系时,我们应该只使用一个关系来表示它。因此,在查询图表时,我们可以横向从a
到b
和b
到a
。当双向关系中的某些数据在a
到b
和b
到a
之间有所不同时,您只需要一个额外的关系。假设模型中的用户之间的互动具有权重,并且此权重可能不同于a
到b
和b
到a
。在这种情况下,您可以将此权重存储为关系中的属性。例如:
(a)-[:INTERACTS_WITH {weight:10}]->(b)
(b)-[:INTERACTS_WITH {weight:6}]->(a)
查看this link关于建模双向关系的信息。