按关系数对结果排序

Order the result by the number of relationships

我有一个定向多图。通过这个查询,我试图找到所有连接到节点的节点 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)及其他们之间的关系正是我需要的。

Nodes n1_1187, n2_2280, n2_1834, n2_932 and n2_722 are connected to the node n1_34

现在我需要根据它们在该子图中的关系对它们进行排序。因此,例如,n1_1187 应该在 4 个关系之上,而其他人有 1 个关系。

我遵循了这个 post: 但它给我的结果与上面的查询相同。我也尝试 return count(r) 但它给了我 1 因为它计算了所有独特的关系而不是与共同 source/target.

的关系

通常使用 networkx,我可以将此结果复制到子图中,然后计算每个节点的关系。我可以在不修改当前图形的情况下使用 neo4j 做到这一点吗?怎么样?

请帮忙。还是有别的办法?

此查询应该满足您的需要:

MATCH (n1:Node{uuid: "n1_34"})-[r]-(n2:Node)
RETURN n1, n2, count(*) AS freq
ORDER BY freq DESC

此代码段将重新创建您的图表以供测试:

WITH ['n1_34,n1_1187','n1_34,n2_2280','n1_34,n2_1834','n1_34,n2_722',    'n1_34,n2_932','n1_1187,n2_2280','n1_1187,n2_932','n1_1187,n2_1834',       'n1_1187,n2_722'] AS node_relationships
UNWIND node_relationships as relationship
with split(relationship, ",") as nodes
merge(n1:Node{label:nodes[0]})
merge(n2:Node{label:nodes[1]})
merge(n1)-[:LINK]-(n2)

一旦达到 运行,我正在使用的图表如下所示:

然后此 CQL 将 select 子图中的节点,然后计算它们各自的关联链接中的每一个,但仅限于子图中已经存在的其他节点:

match(n1:Node{label:'n1_34'})-[:LINK]-(n2:Node)
with collect(distinct(n2)) as subgraph_nodes
unwind subgraph_nodes as subgraph_node
match(subgraph_node)-[r:LINK]-(n3:Node)
where n3 in subgraph_nodes
return subgraph_node.label, count(r) order by count(r) DESC

运行 以上会产生以下结果:

使用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 的解决方案(调整为 return subgraph_node 而不是 subgraph_node.label,以实现奇偶校验)需要 92 次 DB 匹配。

@LuckyChandrautama 自己的解决方案(在对 Darren 的回答的评论中提供,并进行了调整以匹配 Darren 的样本数据),使用 122 次 DB 命中。

这表明使用 PROFILE 评估不同 Cypher 解决方案对实际数据的性能的重要性。你应该尝试用你的实际数据来做,看看哪一个最适合你。