使用cypher返回多个关系权重

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用cypher返回多个关系权重相关的知识,希望对你有一定的参考价值。

我有一个图表,其中一个节点类型为'nodeName',一个关系类型为'relName'。每个节点对彼此具有0-1'relName'关系,但每个节点可以连接到许多节点。

给定一个初始节点列表(我将此列表称为查询子集),我想:

  1. 找到连接到查询子集的所有节点

我目前正在这样做(可能过于复杂):

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
  1. 然后,对于每个连接的节点(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返回多个关系权重的主要内容,如果未能解决你的问题,请参考以下文章

Cypher where子句因多条路径而失败

如何使用 Neo4J 的 Cypher 查询返回关系类型?

使用Cypher创建与现有节点的多个关系

Neo4j Cypher,仅返回指定的关系

CYPHER存储count() - 进一步使用的值

替换从 VAST 代码返回的多个 HLS VOD 片段