Cypher-如何为最短路径上的节点设置属性
Cypher-How to set property for the nodes along the shortestpath
我是 neo4j 和 cypher 的新手,有大约一周的经验...我正在做一个小项目来处理成千上万个 TWS 批处理作业的图表 运行ning在我公司的主机上。一个关键的任务是找出我们所说的午夜最后一批批处理作业的关键路径,这实际上是neo4j中的加权最短路径。我已经使用下面的密码实现了这个目标。
MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...})
call apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
RETURN path,weight`
我用 neo4j 驱动程序创建了一个 python,它每天自动 运行s,从 rbdms 中提取批处理作业数据,并每天在 neo4j 和 运行 中创建一个新图表] 密码并格式化结果密钥路径以适合我的 MySQL 以便我可以比较每个不同日期的密钥路径
但是我想到了一个新想法,如果我可以增强这个密码,使返回路径上的节点设置为 label/or 和 属性 会怎么样? 这样我以后就可以轻松地再次引用密钥路径,而不必每次都调用 Dijkstra。我知道我可以使用我的 python 程序来做到这一点,就在密钥路径返回并生成一系列密码来完成这项工作之后,但我认为应该有一个单独使用密码的解决方案。非常感谢!
- 计算路径标识符值
- 您需要沿路径获取节点数组 - NODES
- 遍历每个节点 - UNWIND or FOREACH
- Set or label or 属性 - 现在你不能使用变量的值作为标签,这意味着写入 属性 - 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
我是 neo4j 和 cypher 的新手,有大约一周的经验...我正在做一个小项目来处理成千上万个 TWS 批处理作业的图表 运行ning在我公司的主机上。一个关键的任务是找出我们所说的午夜最后一批批处理作业的关键路径,这实际上是neo4j中的加权最短路径。我已经使用下面的密码实现了这个目标。
MATCH (a:Job {Jobname:...}),(b:Job {Jobname:...})
call apoc.algo.dijkstra(a,b,'runafter>','Duration') YIELD path, weight
RETURN path,weight`
我用 neo4j 驱动程序创建了一个 python,它每天自动 运行s,从 rbdms 中提取批处理作业数据,并每天在 neo4j 和 运行 中创建一个新图表] 密码并格式化结果密钥路径以适合我的 MySQL 以便我可以比较每个不同日期的密钥路径
但是我想到了一个新想法,如果我可以增强这个密码,使返回路径上的节点设置为 label/or 和 属性 会怎么样? 这样我以后就可以轻松地再次引用密钥路径,而不必每次都调用 Dijkstra。我知道我可以使用我的 python 程序来做到这一点,就在密钥路径返回并生成一系列密码来完成这项工作之后,但我认为应该有一个单独使用密码的解决方案。非常感谢!
- 计算路径标识符值
- 您需要沿路径获取节点数组 - NODES
- 遍历每个节点 - UNWIND or FOREACH
- Set or label or 属性 - 现在你不能使用变量的值作为标签,这意味着写入 属性 - 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