2017-03-09 143 views
2

我是neo4j和cypher的新手,拥有大约一周的经验......我正在处理一个小型项目,用数千个图TWS批处理作业在我公司的主机上运行。一个关键的任务是找出我们称之为午夜最后一批批处理作业的关键路径,这实际上是neo4j中加权最短路径。我已经用下面的密码来实现这个目标。Cypher-如何为最短路径上的节点设置属性

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

我创建了Neo4j的司机蟒蛇,它每天自动运行,来提取rbdms批处理作业的数据和每天的Neo4j创造了一个新的图形和运行cyphers和格式化结果关键路径适合我的MySQL,以便我可以比较每天不同的关键路径

但我想到了一个新想法,如果我可以增强此密码以便沿返回路径的节点将被设置为标签/或财产?,以便我以后可以轻松地再次参考关键路径,而无需每次调用​​Dijkstra。我知道我可以使用我的python程序来做到这一点,只是在关键路径返回后生成一系列密码来完成这项工作,但我认为应该有一个单独的密码解决方案。提前感谢!

回答

2
  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 
+0

非常感谢!我尝试了所有的密码,他们只是像魅力一样工作!这些伟大的例子确实帮助我更好地理解了密码和neo4j的威力......再次感谢! – AlexDxl

+0

@AlexDxl http://stackoverflow.com/help/someone-answers –

相关问题