首页 > 解决方案 > 按关系数对结果排序

问题描述

我有一个有向多重图。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 做到这一点吗?如何?

请帮忙。还是有其他方法?

标签: graphneo4jcypherrelationshipdirected-graph

解决方案


使用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 解决方案的性能的重要性。你应该尝试用你的实际数据来做这件事,看看哪一个最适合你。


推荐阅读