【问题标题】:Neo4j: find degree of connectionNeo4j:查找连接度
【发布时间】:2017-06-25 06:56:56
【问题描述】:

我正在使用 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)

如果您对如何创建上述数据集有任何提示,请告诉我。

非常感谢!

【问题讨论】:

  • 您不必创建相反的关系,只需不要在查询中指定方向 ()-[]-()
  • 谢谢,但看起来 Neo4j 中的所有关系都必须有一个方向(根据this 帖子)。
  • 确实,所有的关系都是有方向的。但是,当您查询结果时,您不必指定方向。根据您提供的链接中的示例: MATCH (A)-[FRIEND]-(B) RETURN A, B​​span>
  • @JeromeB,感谢您的建议,但我认为定义双向的 [FRIEND] 仍然很重要。想象一个场景,节点 A 流入节点 B 并且它也流入节点 C。在这种情况下,我希望节点 C 和 B 共享 2 度连接,但除非您定义 A -> B AND A C 和 A

标签: neo4j cypher graph-theory graph-databases


【解决方案1】:

有没有比简单地运行 shortestPath() 更好的方法来做到这一点 每对用户的功能?如果没有,那么最好的方法是什么 在 Neo4j 中循环用户?

我相信为每一对用户运行shortestPath() 是一个不错的选择,但请记住,它应该非常昂贵。

另外,我想方向在这里很重要,你也一样 建议使这种关系是双向的,这样对于每个 (user1)-[:INTERACTS_WITH]->(user2) 我也会创建相反的 关系(user2)-[:INTERACTS_WITH]->(user1)?

不,你不需要另一个关系。请记住,在 Neo4j 中的查询时可以忽略关系方向。当建模自然是双向的关系时,我们应该只使用一种关系来表示它。因此,在查询图形时,我们可以从abba。当双向关系中的某些数据在abba 之间可能不同时,您只需要一个额外的关系。假设模型中用户之间的交互有一个权重,这个权重可以从abba 不同。在这种情况下,您可以将此权重作为属性存储在关系中。示例:

(a)-[:INTERACTS_WITH {weight:10}]->(b)
(b)-[:INTERACTS_WITH {weight:6}]->(a)

查看this link,了解如何建模双向关系。

【讨论】:

  • 感谢您的回答。 “仅从 a 到 b 而不是 a 到 b 和 b 到 a 的最短路径”是什么意思?应该是“A 到 B 而不是 B 到 A”吗?如果是这样,在单向图中我不会得到 A 到 B 和 B 到 A 的不同结果吗?如果是这样,那么我需要两个数字
  • 你好@de1pher。是的你是对的。我从我的答案中删除了它。谢谢。
  • 太好了,谢谢!关于如何构建此查询的任何提示?您认为在 R / Python 中运行实际循环会为每对用户发送一个单独的查询可能是一个好主意吗?
猜你喜欢
  • 1970-01-01
  • 2018-08-13
  • 2017-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多