代码之家  ›  专栏  ›  技术社区  ›  João Otero

Cypher-计算时如何遍历图形

  •  0
  • João Otero  · 技术社区  · 6 年前

    如何指定一个Cypher查询来返回连接的节点,距离路径中权重平均值最高的初始节点1到3跳?

    图表是: (我知道我在这里没有使用密码符号。)

    A-[2]-B-[4]-C
    A-[3.5]-D
    

    它将返回D,因为3.5>(2+4)/2

    A-[2]-B-[4]-C
    A-[3.5]-D
    A-[2]-B-[4]-C-[20]-E
    A-[2]-B-[4]-C-[20]-E-[80]-F
    

    它将返回E,因为(2+4+20)/3>3.5

    2 回复  |  直到 6 年前
        1
  •  0
  •   jjaderberg    6 年前

    编写查询的一种方法是

    MATCH p=(A {name: 'A'})-[*1..3]-(x)
    UNWIND [r IN relationships(p) | r.weight] AS weight
    RETURN x.name, avg(weight) AS avgWeight
      ORDER BY avgWeight DESC
      LIMIT 1
    

    在这里,我们将路径中的权重提取到一个列表中,然后展开该列表。试着在那里插入一个返回,看看结果在那一点上是什么样子的。因为我们可以利用 avg() avg(weight) ,同时也是最后一个路径节点的名称,聚合将按该节点名称分组。如果不想返回权重,则只返回节点名,然后更改 RETURN WITH 在查询中,添加另一个只返回节点名的return子句。

    您还可以添加 [n IN nodes(p) | n.name] AS nodesInPath A, B, C 等。

    CREATE (A {name: 'A'}),
           (B {name: 'B'}),
           (C {name: 'C'}),
           (D {name: 'D'}),
           (E {name: 'E'}),
           (F {name: 'F'}),
    (A)-[:R {weight: 2}]->(B),
    (B)-[:R {weight: 4}]->(C),
    (A)-[:R {weight: 3.5}]->(D),
    (C)-[:R {weight: 20}]->(E),
    (E)-[:R {weight: 80}]->(F)
    
        2
  •  0
  •   stdob--    6 年前

    1) 要选择长度从1到3的可能路径,请使用match with variable length relationships

    MATCH p = (A)-[*1..3]->(T)
    

    2) 然后使用 reduce function 计算平均重量。然后排序和限制以获取一个值:

    MATCH p = (A)-[*1..3]->(T)
    WITH p, T, 
         reduce(s=0, r in rels(p) | s + r.weight)/length(p) AS weight
    RETURN T ORDER BY weight DESC LIMIT 1