使用密码

时间:2018-03-01 11:25:50

标签: neo4j cypher

我有一个图表,其中包含一个节点类型' nodeName'和一种关系类型' relName'。每个节点对都有0-1' relName'彼此之间的关系,但每个节点可以连接到许多节点。

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

  1. 查找连接到查询子集的所有节点
  2. 我目前正在这样做(可能过于复杂):

    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
    2. 例如。如果节点b1有4个边连接到查询子集中的节点,我想{b}的RETURN SUM(r2.weight) AS totalWeight。我实际上需要一个按totalWeight排序的所有b节点的列表。

      没有。 2是我被困的地方。我一直在阅读关于FOREACH和reduce()的文档,但我不确定如何在这里应用它们。

      速度非常重要,因为我有30,000个节点和1.5M边缘,如果您对此有任何建议请将它们混合在一起。

      非常感谢

      马特

2 个答案:

答案 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