Neo4j数据库中的路径查询语言

记录学习过程中的问题

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值