【问题标题】:Cypher-How to set property for the nodes along the shortestpathCypher-如何为沿最短路径的节点设置属性
【发布时间】:2017-07-30 01:03:35
【问题描述】:

我是 neo4j 和 cypher 的新手,有大约一周的经验...我正在做一个小项目,以处理在我公司的大型机上运行的成千上万个 TWS 批处理作业的图表。一个关键任务是找出我们所说的午夜最后一批批处理作业的 key-path,实际上是 neo4j 中的加权最短路径。我已经使用如下密码实现了该目标。

MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) 
call apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
RETURN path,weight`

我用 neo4j 驱动程序创建了一个 python,它每天自动运行,从 rbdms 中提取批处理作业数据,每天在 neo4j 中创建一个新图形,运行密码并格式化结果键路径以适合我的 MySQL 所以我可以比较每一天的关键路径

但是我想到了一个新想法,如果我可以增强这个密码,以便为返回路径上的节点设置标签/或属性呢?这样我以后可以轻松地再次参考密钥路径,而无需每次都调用 Dijkstra。我知道我可以使用我的 python 程序来做到这一点,就在密钥路径返回并生成一系列密码来完成这项工作之后,但我认为应该有一个单独的密码解决方案。提前非常感谢!

【问题讨论】:

    标签: neo4j cypher neo4j-apoc


    【解决方案1】:
    1. 计算路径标识符值
    2. 您需要沿路径获取节点数组 - NODES
    3. 遍历每个节点 - UNWINDFOREACH
    4. 设置或标签或属性 - 现在你不能使用变量的值作为标签,这意味着写入属性 - SET

    MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) WITH a, b,
         a.Jobname + '-' + b.Jobname AS pathID
    CALL apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
    FOREACH (n IN NODES(path)|
      SET n.pathID = pathID,
          n.pathWeight = weight
    )
    RETURN path,weight
    

    由于你使用apoc,你可以set labels

    MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) WITH a, b,
         'inCalculatedPath' + '-' + a.Jobname + '-' + b.Jobname AS pathID
    CALL apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
    CALL apoc.create.addLabels( NODES(path), ['inCalculatedPath', pathID])
    RETURN path,weight
    

    另一种方法是添加类似Calculated path 节点的内容:

    MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) WITH a, b
    CALL apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
    CREATE (P:CalculatedPath) 
      SET P.weight = weight,
          P.start = ID(a),
          P.end = ID(b),
          P.pathNodes = REDUCE(ids=[], n IN NODES(path)| ids + ID(n)),
          P.pathRels  = REDUCE(ids=[], r IN RELS(path) | ids + ID(r))
    FOREACH (n IN NODES(path)|
      MERGE (n)-[:inPath]->(P)
    )
    RETURN path, weight
    

    然后返回路径:

    MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...}) WITH a, b
    MATCH (path:CalculatedPath {start: ID(A), end: ID(b)})
    RETURN path, path.weight AS weight
    

    【讨论】:

    • 非常感谢!我尝试了所有密码,它们就像魅力一样工作!那些很好的例子真的帮助我更好地理解了 cypher 和 neo4j 的力量......再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多