码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • neo4j查询两节点之间所有路径/关系


    目录

    数据源

    查询两节点有效的路径

    所有路径(不准确)

    有效路径(准确)

    查询两节点之间最短路径

    查询两节点之间所有的最短路径


    数据源

    查询两节点有效的路径

    路径长度(5个节点之内),一般都会做限制,否则数据库一但内容过多就会卡死

    所有路径(不准确)

    最容易想到的就是这样写,但是结果是不准确的。

    1. match p = (a)-[r*..5]-(b)
    2. where a.name = '刘备' and b.name='刘禅'
    3. return p

    为什么不准确?

    可以看到,刘禅与关羽、张飞、糜夫人、糜芳、糜竺  关系不是很大,因为他们是刘备的关系群

    那为何还是能搜到呢?

    因为我们设置了最大路径是5

    因此张飞出现的原因就是这样的路径

    1. 刘备-张飞-刘备-刘禅
    2. 刘备-张飞-关羽-刘备-刘禅

    可以看到,刘备(目标节点)在一条路径中出现了两次,所以导致一些不相关的节点出现了,其他节点(糜夫人、糜芳、糜竺)也是类似问题。

    问题验证

    我们可以把每条路径中的节点名称抽取出来看看

    1. match p = (a)-[r*..5]-(b)
    2. where a.name = '刘备' and b.name='刘禅'
    3. return extract(n in nodes(p)| n.name)

    与我们想的结果一致

    如何解决这个问题?

    问题就是在一条路径(p)中,有重复人员的出现

    那么解决方案就是,去掉路径(p)中有重复人员的路径(p)

    1. // 相当于遍历nodes, 每得到一个node就在nodes中找一下他自己有几个,如果不等于1就不要了
    2. and ALL( n1 in nodes(p) where size(filter(n2 in nodes(p) where id(n1) = id(n2)))=1 )
    3. // 新版本neo4j 不支持fliter函数 用[]代替
    4. and ALL( n1 in nodes(p) where size([n2 in nodes(p) where id(n1) = id(n2)])=1 )

    有效路径(准确)

    最终方案

    1. match p = (a)-[r*..5]-(b)
    2. where a.name = '刘备' and b.name='刘禅'
    3. and ALL( n1 in nodes(p) where size(filter(n2 in nodes(p) where id(n1) = id(n2)))=1 )
    4. return p
    5. // 新版
    6. match p = (a)-[r*..5]-(b)
    7. where a.name = '刘备' and b.name='刘禅'
    8. and ALL( n1 in nodes(p) where size([n2 in nodes(p) where id(n1) = id(n2)])=1 )
    9. return p

    查询两节点之间最短路径

    // TODO 还可以设置最短路径权重

    1. match p = shortestpath((a)-[r*0..4]-(b))
    2. where a.name = '刘备' and b.name='刘禅'
    3. return p

    查询两节点之间所有的最短路径

    最短路径如果不加权重的话,不如用所有最短路径,因为你没有规定最短路径的含义。

    这个也经常用,但是如果梳理两个节点关系的时候 这样写会漏掉长的路径,导致结果不完全。

    1. match p = allshortestpaths((a)-[r*0..4]-(b))
    2. where a.name = '刘备' and b.name='刘禅'
    3. return p

  • 相关阅读:
    react简单写一个transition动画组件然后在modal组件中应用
    Vue3中 子组件内v-model绑定props接收到参数时报错update:modelValue
    CCF大数据与计算智能大赛训练赛——图书推荐系统技术报告
    【Spring】Spring中更简单的存储和读取Bean手术刀剖析
    ROS 导航
    Python3,选择Python自动安装第三方库,从此跟pip说拜拜!!
    LeetCode Algorithm 2326. 螺旋矩阵 IV
    医学图像分割利器:U-Net网络详解及实战
    Arcgis横向图例设置
    day03_基础语法
  • 原文地址:https://blog.csdn.net/java_creatMylief/article/details/127664455
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号