graph - 按关系数对结果排序
问题描述
我有一个有向多重图。uuid
通过这个查询,我试图找到所有使用n1_34连接到节点的节点
MATCH (n1:Node{uuid: "n1_34"}) -[r]- (n2:Node) RETURN n2, r
这会给我一个列表n2
(n1_1187、n2_2280、n2_1834、n2_932 和 n2_722)以及它们之间的关系,这正是我所需要的。
节点 n1_1187、n2_2280、n2_1834、n2_932 和 n2_722 连接到节点 n1_34
现在我需要根据它在这个子图中的关系对它们进行排序。因此,例如,n1_1187 应该有 4 个关系,而其他有 1 个关系。
我关注了这篇文章:Extract subgraph from Neo4j graph with Cypher,但它给了我与上面的查询相同的结果。我也尝试返回count(r)
,但它给了我 1,因为它计算所有唯一关系而不是与公共源/目标的关系。
通常使用 networkx 我可以将此结果复制到子图中,然后计算每个节点的关系。我可以在不修改当前图表的情况下使用 neo4j 做到这一点吗?如何?
请帮忙。还是有其他方法?
解决方案
使用PROFILE来评估使用@DarrenHick 的示例数据的一些现有解决方案的效率,以下是我发现的最有效的一种,只需要 84 次 DB 命中:
MATCH (n1:Node{label:'n1_34'})-[:LINK]-(n2:Node)
WITH COLLECT(n2) AS nodes
UNWIND nodes AS n
RETURN n, SIZE([(n)-[:LINK]-(n3) WHERE n3 IN nodes | null]) AS cnt
ORDER BY cnt DESC
Darren 的解决方案(调整为 returnsubgraph_node
而不是subgraph_node.label
, 用于奇偶校验)需要 92 个 DB 命中。
@LuckyChandrautama 自己的解决方案(在对 Darren 的回答的评论中提供,并根据 Darren 的样本数据进行了调整)使用 122 个 DB 命中。
这表明了使用 PROFILE 来根据实际数据评估不同 Cypher 解决方案的性能的重要性。你应该尝试用你的实际数据来做这件事,看看哪一个最适合你。
推荐阅读
- csv - Spark 在读取 CSV 时跳过不良记录
- c# - 从对角线不为零的矩阵中提取子矩阵
- java - session.getTransaction().commit() 是否在休眠中关闭会话?
- javascript - 从当前视图打印另一个视图
- python - 熊猫 Series.from_records?
- flask - Flask (cPanel) 上的 404 错误。需要 3 次刷新
- php - 如何在应用程序中正确插入 opcache_compile_file?
- javascript - 无法让子挂钩接收状态
- java - 在新值之前清除科学按钮
- html - margin-right 不适用于相对元素?(宽度 100%)