记录学习过程中的问题
1、最短路径
allshortestpaths 或者 shortestpath 返回的是最短路径(不考虑权重),即仅考虑最短跳转次数。限定最大深度为7时,它们只返回最短跳转的路径
(1)shortestpath 当最短路径长度为3的路径条数一共有2两条,它只会返回其中一条
p2=graph.run('match p=shortestpath((a:node)-[r:rel*..7]->(b:node)) where a.name="a" and b.name="d" return p').data()
实验结果
{'p': Path(Node('node', name='a'), rel(Node('node', name='a'), Node('node', name='f')), rel(Node('node', name='f'), Node('node', name='k')), rel(Node('node', name='k'), Node('node', name='d')))}
(2)allshortestpaths当最短路径长度为3的路径条数一共有2两条,它只全部返回
p2=graph.run('match p=allshortestpaths((a:node)-[r:rel*..7]->(b:node)) where a.name="a" and b.name="d" return p').data()
实验结果
第一条:
{'p': Path(Node('node', name='a'), rel(Node('node', name='a'), Node('node', name='f')), rel(Node('node', name='f'), Node('node', name='k')), rel(Node('node', name='k'), Node('node', name='d')))}
第二条:
{'p': Path(Node('node', name='a'), rel(Node('node', name='a'), Node('node', name='b')), rel(Node('node', name='b'), Node('node', name='c')), rel(Node('node', name='c'), Node('node', name='d')))}
2、带权最短路径
以权重为标准累加求得最小的路径,(如果希望权重越大的路径,可以对权重求倒数重新赋值给边上的属性newlenovostrength)
p=graph.run('MATCH (from:node), (to:node) where from.name="{0}" and to.name="{1}" '
'CALL apoc.algo.dijkstra(from, to, "rel>", "newlenovostrength") '
'yield path as path, weight as weight RETURN length(path),weight'.format('a','d')).data()
实验结果
{'length(path)': 4, 'weight': 0.4}
缺点:没有办法限定深度
3、返回两个节点间的所有路径
p3=graph.run('MATCH (from:node), (to:node) where from.name="a" and to.name="d" '
'CALL apoc.algo.allSimplePaths(from, to, "rel>", 7) YIELD path RETURN path').data()
结果:
{'path': Path(Node('node', name='a'), rel(Node('node', name='a'), Node('node', name='f')), rel(Node('node', name='f'), Node('node', name='k')), rel(Node('node', name='k'), Node('node', name='d')))}
{'path': Path(Node('node', name='a'), rel(Node('node', name='a'), Node('node', name='b')), rel(Node('node', name='b'), Node('node', name='c')), rel(Node('node', name='c'), Node('node', name='d')))}
{'path': Path(Node('node', name='a'), rel(Node('node', name='a'), Node('node', name='y')), rel(Node('node', name='y'), Node('node', name='z')), rel(Node('node', name='z'), Node('node', name='w')), rel(Node('node', name='w'), Node('node', name='d')))}
上面 7 表示允许的路径深度(跳转次数为7)
针对3,其只可以返回路径;根据需要做修改:
(1)返回每个路径(path)上边的权重
MATCH (from:node), (to:node) where from.name='a' and to.name='d'
CALL apoc.algo.allSimplePaths(from, to, 'rel>', 5)
YIELD path
RETURN [r in relationships(path)|r.lenovostrength] as r
实验结果
r
[2.0, 2.0, 2.0]
[1.0, 1.0, 1.0]
[10.0, 10.0, 10.0, 10.0]
(2)返回 lenovostrength累加结果,利用reduce累加
MATCH (from:node), (to:node) where from.name='a' and to.name='d'
CALL apoc.algo.allSimplePaths(from, to, 'rel>', 5)
YIELD path
RETURN reduce(totalAge = 0, rr IN relationships(path)| totalAge + 1/rr.lenovostrength) AS reduction
实验结果
reduction
1.5
3.0
0.4