我有一个图表,其中包含一个节点类型' 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
例如。如果节点b1有4个边连接到查询子集中的节点,我想{b}的RETURN SUM(r2.weight) AS totalWeight
。我实际上需要一个按totalWeight排序的所有b节点的列表。
没有。 2是我被困的地方。我一直在阅读关于FOREACH和reduce()的文档,但我不确定如何在这里应用它们。
速度非常重要,因为我有30,000个节点和1.5M边缘,如果您对此有任何建议请将它们混合在一起。
非常感谢
马特
答案 0 :(得分:0)
我认为我们可以稍微简化一下这个问题。
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)。
答案 1 :(得分:0)
为什么需要这么多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