按关系数对结果排序
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 解决方案对实际数据的性能的重要性。你应该尝试用你的实际数据来做,看看哪一个最适合你。
我有一个定向多图。通过这个查询,我试图找到所有连接到节点的节点 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: 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 解决方案对实际数据的性能的重要性。你应该尝试用你的实际数据来做,看看哪一个最适合你。