使用cypher返回多个关系权重
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用cypher返回多个关系权重相关的知识,希望对你有一定的参考价值。
我有一个图表,其中一个节点类型为'nodeName',一个关系类型为'relName'。每个节点对彼此具有0-1'relName'关系,但每个节点可以连接到许多节点。
给定一个初始节点列表(我将此列表称为查询子集),我想:
- 找到连接到查询子集的所有节点
我目前正在这样做(可能过于复杂):
MATCH (a: nodeName)-[r:relName]-()
WHERE (a.name IN ['query list'])
WITH a
MATCH (b: nodeName)-[r2:relName]-()
WHERE NOT (b.name IN ['query list'])
WITH a, b
MATCH (a)--(b)
RETURN DISTINCT b
- 然后,对于每个连接的节点(b),我想返回连接到查询子集的权重的SUM
例如。如果节点b1有4个边连接到查询子集中的节点,我想RETURN SUM(r2.weight) AS totalWeight
为b2。我实际上需要一个按totalWeight排序的所有b节点的列表。
2号是我被困的地方。我一直在阅读有关FOREACH和reduce()的文档,但我不确定如何在这里应用它们。
速度非常重要,因为我有30,000个节点和1.5M边缘,如果您对此有任何建议请将它们混合在一起。
非常感谢
马特
答案
你为什么需要这么多的Match
陈述?您可以在单个a
语句中指定b
节点和Match
节点,并仅选择那些具有它们之间关系的节点。
之后只返回b
节点和权重之和。如果b
节点与聚合函数(如sum
)一起返回,它将自动充当一个组。
MATCH (a:nodeName)-[r:relName]-(b:nodeName)
WHERE (a.name IN ['query list']) AND NOT((b.name IN ['query list']))
RETURN b.name, sum(r.weight) as weightSum order by weightSum
另一答案
我想我们可以简化一下这个查询。
MATCH (a: nodeName)
WHERE (a.name IN ['query list'])
WITH collect(a) as subset
UNWIND subset as a
MATCH (a)-[r:relName]-(b)
WHERE NOT b in subset
RETURN b, sum(r.weight) as totalWeight
ORDER BY totalWeight ASC
由于sum()
是一个聚合函数,它将使非聚合变量成为分组键(在本例中为b
),因此总和是每个b
节点,然后我们对它们进行排序(如果需要,切换到DESC)。
以上是关于使用cypher返回多个关系权重的主要内容,如果未能解决你的问题,请参考以下文章