首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Neo4j循环递归查询

在 Neo4j 中,递归查询通常用于处理图中的循环或路径查找问题。Cypher 查询语言提供了 MATCHWITH 语句的组合来实现递归查询。特别是,apoc.path.expandConfig 是一个非常强大的 APOC(Awesome Procedures On Cypher)库函数,可以用于复杂的路径扩展和递归查询。

示例场景

假设你有一个社交网络图,其中节点表示用户,关系表示朋友关系。你想找到从某个用户开始的所有朋友,朋友的朋友,等等,直到一定的深度。

使用 Cypher 进行递归查询

1. 使用 MATCHWITH

你可以使用 MATCHWITH 语句来实现递归查询。以下是一个示例,查找从某个用户开始的所有朋友,直到深度 3。

代码语言:javascript
复制
MATCH (start:User {name: 'Alice'})
CALL apoc.path.expandConfig(start, {
    relationshipFilter: 'FRIEND',
    minLevel: 1,
    maxLevel: 3
}) YIELD path
RETURN path

2. 使用 apoc.path.expandConfig

apoc.path.expandConfig 是一个非常灵活的函数,可以配置多种路径扩展选项。以下是一个更详细的示例:

代码语言:javascript
复制
MATCH (start:User {name: 'Alice'})
CALL apoc.path.expandConfig(start, {
    relationshipFilter: 'FRIEND>',
    minLevel: 1,
    maxLevel: 3,
    uniqueness: 'NODE_GLOBAL'
}) YIELD path
RETURN path

在这个示例中:

  • relationshipFilter: 'FRIEND>' 指定了要遍历的关系类型。
  • minLevel: 1maxLevel: 3 指定了递归的最小和最大深度。
  • uniqueness: 'NODE_GLOBAL' 确保每个节点在全局范围内只被访问一次。

处理循环

在处理图中的循环时,确保使用适当的唯一性设置,以避免无限循环。apoc.path.expandConfig 提供了多种唯一性选项:

  • NODE_GLOBAL:全局唯一性,每个节点只访问一次。
  • NODE_PATH:路径唯一性,每个节点在每条路径中只访问一次。
  • RELATIONSHIP_GLOBAL:全局关系唯一性,每个关系只访问一次。
  • RELATIONSHIP_PATH:路径关系唯一性,每个关系在每条路径中只访问一次。

示例:查找所有朋友直到深度 3,并避免循环

代码语言:javascript
复制
MATCH (start:User {name: 'Alice'})
CALL apoc.path.expandConfig(start, {
    relationshipFilter: 'FRIEND>',
    minLevel: 1,
    maxLevel: 3,
    uniqueness: 'NODE_GLOBAL'
}) YIELD path
RETURN path

示例:查找所有朋友直到深度 3,并返回节点和关系

代码语言:javascript
复制
MATCH (start:User {name: 'Alice'})
CALL apoc.path.expandConfig(start, {
    relationshipFilter: 'FRIEND>',
    minLevel: 1,
    maxLevel: 3,
    uniqueness: 'NODE_GLOBAL'
}) YIELD path
UNWIND nodes(path) AS node
UNWIND relationships(path) AS rel
RETURN DISTINCT node, rel

安装 APOC 库

如果你还没有安装 APOC 库,可以通过以下步骤安装:

  1. 下载 APOC jar 文件,并将其放置在 Neo4j 的 plugins 目录中。
  2. 修改 neo4j.conf 文件,启用 APOC:
代码语言:javascript
复制
dbms.security.procedures.unrestricted=apoc.*
  1. 重启 Neo4j 服务器。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

递归查询

------------------------------------------------------------------------ Start with...Connect By子句递归查询一般用于一个表维护树形结构的应用...''',''''1''''); INSERT INTO TBL_TEST(ID,NAME,PID) VALUES(''''5'''',''''121'''',''''2''''); 从Root往树末梢递归...pid = id MSSQL ---------------------------------------------------------------------------------- 使用递归公用表表达式显示递归的多个级别...使用递归公用表表达式显示递归的两个级别。 以下示例显示经理以及向经理报告的雇员。将返回的级别数目被限制为两个。...使用递归公用表表达式显示层次列表 以下示例在示例 C 的基础上添加经理和雇员的名称,以及他们各自的头衔。通过缩进各个级别,突出显示经理和雇员的层次结构。

95740

for循环递归、回溯

目录: 1.简单递归定义 2.递归循环的区别与联系 3.递归的经典应用 1.简单递归定义 什么叫递归?...说对了一半,不过递归是一种思想,现在还暂时不能说透,需要大家先比较一下循环递归的相同点和不同点(饭一口一口吃,别着急) 2.递归循环的区别于联系 相同点: (1)都是通过控制一个变量的边界(或者多个...简单的来说就是:用循环能实现的,递归一般可以实现,但是能用递归实现的,循环不一定能。...这是一个循环只注重循环次数的常见例子,我们知道,用循环有点无从下手(就目前作者水平来看),但是递归就很好写了。 汉诺塔,什么鬼,我不会啊? 别急,慢慢来。...(2)递归可以是多个“递”,也可以是多个“归”;而循环由始至终都只由一个变量控制(就算有几个变量同时控制)也只有一个出口,每次循环也只是一个“递”。

1.2K51
  • 循环?还是递归

    【杭州-Java-JOEL】 你要打断点看哪行出错了 【西安-Java-小白】 栈溢出,mybatis执行查询的时候,循环查询,1000条查询一次,到160多次的时候栈溢出 【北京-Android...刚把递归干掉了,换成循环试试。...换成while了 【北京-Android-背影】 嗯嗯,等会给我们说下结果 【西安-Java-小白】 感觉速度比递归快太多了 【杭州-Java-JOEL】 查询的时候批量去查稍微好点...接下来,我们就一起讨论下递归循环吧,该如何用,他们都有哪些区别呢?时间复杂度,空间复杂度又是多少呢 循环递归验证 循环:当满足某一条件时,进行反复执行某一操作(循环体)。...循环递归区别 循环 优点:结构简单 缺点:并不能解决所有的问题。有的问题适合使用递归而不是循环,如果使用循环并不困难的话,最好使用循环

    1.2K30

    递归改成循环_递归循环效率高吗

    Java递归递归循环 为什么大家都说不建议用递归?...一个简单的例子测试递归的深度 递归的使用注意点 1.注意递归的结束条件 递归的优势 代码简单清晰,一看就懂,如果在不会照成栈溢出还是建议使用递归的。 所有的递归都可以改循环吗?理论上是可以的。...以下一个嵌套递归,改循环的例子 嵌套递归:工作要求需要将一个集合中有subList的对象的code记录一下,无subList对象的code记录在一起 //递归查到所有的drugtypes //嵌套递归...hasNotChildCodeList){ for (BaseDrugType drugType:drugTypes){ if (drugType == null){ continue; } //递归查询...hasChildCodeList,hasNotChildCodeList); }else { hasNotChildCodeList.add(drugType.getCode()); } } } 嵌套递归循环

    57610

    mysql省市区递归查询_mysql 递归查询

    和子节点 包含mysql 递归查询父节点 和子节点 mysql递归查询,查父集合,查子集合 查子集合 –drop FUNCTION `getChildList` CREATE FUNCTION `getChi...在My … MySQL递归查询树状表的子节点、父节点具体实现 mysql版本(5.5.6等等)尚未支持循环递归查询,和sqlserver.oracle相比,mysql难于在树状表中层层遍历的子节点.本程序重点参考了下面的资料...,写了两个sql存储过程,子节点查询算 … 递归的实际业务场景之MySQL 递归查询 喜欢就点个赞呗!...源码 MySQL递归查询 MySQL8.0已经支持CTE递归查询,举例说明 CREATE TABLE EMP (EMPNO integer NOT NULL, ENAME ), JOB ), MGR integer...查询函数即可实现根据一个节点查询所有的子节点,根据一个子节点查询所有的父节点.对于数据 … mysql 递归查询 主要是对于层级关系的查询 最近遇到了一个问题,在mysql中如何完成节点下的所有节点或节点上的所有父节点的查询

    10.8K20

    PostgreSQL=>递归查询

    where条件(e3.id=e2.parent_id) ,取虚拟表的ID和实体表parent_id连     这个条件决定了当前递归查询查询方式(向上查询还是向下查询);   =>第三行的递归开始查询不可缺少...SQL来看,答案其实很简单,在递归完成后将存在子记录的用where条件过滤掉即可(见查询语句最后一行) 嗯,以上几个例子全部是向下递归查询,下面我展示下向上查询的语句,很简单=> 1 with RECURSIVE...,关键,关键是=>第5行的where条件,很意外吧,如此小的改动就有查询方向上的变化,个人对此的理解是:  =>递归向下查询是用虚拟表的id去联结递归表的parent_id   =>递归向上查询是用虚拟表的...~ 最后,需要说明的是,在公司业务满足的情况下尽可能用单层查询语句查询,尤其对于层级较少较固定的结构下较为合适,此建议主要针对的是递归的两大问题而言:  1>递归查询效率较低,尤其是记录较多层级庞大的记录...  2>若现有记录的层级如有交叉,极容易导致递归循环,这点尤其要注意 OK, 本节完成,下节开始讲:“窗口函数” 现在是:2018-01-21 21:20:50,愿各位晚安,明天要上班哦~ p.p1

    1.9K50

    mysql递归查询

    父子查询: 根据父 id 查询下面所有子节点数据;子父查询: 根据子 id 查询上面所有父节点数据;...————mysql递归查询 目录结构: 创建表并添加测试数据 创建表 添加数据 根据父id递归查询所有子节点 创建函数 根据函数查询 根据子id递归查询所有父节点 写sql语句 根据组织机构名称模糊查询所有父节点...INSERT INTO vrv_org_tab VALUES (‘17’, ‘上海linkdd项目组’, ‘4’, ‘9’); select * from vrv_org_tab; 根据父id递归查询所有子节点...根据子id递归查询所有父节点 根据子id查询父节点就不那么麻烦了,不需要写递归函数,当然,你也可以写递归函数来查询。...注意:只支持单个查询,意思是不可以根据两个或者两个以上的子节点同时查询出所有父节点。我们可以看到,上面参数都是单个值进行递归查询的。

    2.9K41

    PostgreSQL=>递归查询

    where条件(e3.id=e2.parent_id) ,取虚拟表的ID和实体表parent_id连     这个条件决定了当前递归查询查询方式(向上查询还是向下查询);   =>第三行的递归开始查询不可缺少...SQL来看,答案其实很简单,在递归完成后将存在子记录的用where条件过滤掉即可(见查询语句最后一行) 嗯,以上几个例子全部是向下递归查询,下面我展示下向上查询的语句,很简单=> 1 with RECURSIVE...,关键,关键是=>第5行的where条件,很意外吧,如此小的改动就有查询方向上的变化,个人对此的理解是:  =>递归向下查询是用虚拟表的id去联结递归表的parent_id   =>递归向上查询是用虚拟表的...~ 最后,需要说明的是,在公司业务满足的情况下尽可能用单层查询语句查询,尤其对于层级较少较固定的结构下较为合适,此建议主要针对的是递归的两大问题而言:  1>递归查询效率较低,尤其是记录较多层级庞大的记录...  2>若现有记录的层级如有交叉,极容易导致递归循环,这点尤其要注意 OK, 本节完成,下节开始讲:“窗口函数” 现在是:2018-01-21 21:20:50,愿各位晚安,明天要上班哦~

    85930

    PostgreSQL=>递归查询

    where条件(e3.id=e2.parent_id) ,取虚拟表的ID和实体表parent_id连     这个条件决定了当前递归查询查询方式(向上查询还是向下查询);   =>第三行的递归开始查询不可缺少...SQL来看,答案其实很简单,在递归完成后将存在子记录的用where条件过滤掉即可(见查询语句最后一行) 嗯,以上几个例子全部是向下递归查询,下面我展示下向上查询的语句,很简单=> 1 with RECURSIVE...,关键,关键是=>第5行的where条件,很意外吧,如此小的改动就有查询方向上的变化,个人对此的理解是:  =>递归向下查询是用虚拟表的id去联结递归表的parent_id   =>递归向上查询是用虚拟表的...最后,需要说明的是,在公司业务满足的情况下尽可能用单层查询语句查询,尤其对于层级较少较固定的结构下较为合适,此建议主要针对的是递归的两大问题而言:  1>递归查询效率较低,尤其是记录较多层级庞大的记录...  2>若现有记录的层级如有交叉,极容易导致递归循环,这点尤其要注意 OK, 本节完成,下节开始讲:“窗口函数” 现在是:2018-01-21 21:20:50,愿各位晚安,明天要上班哦~ p.p1

    1.1K80

    循环递归与魔术(一)——递归循环的数理逻辑

    循环递归本是程序设计中常见的两种代码结构,其中循环对应的数学描述为迭代,递归即为嵌套自身。而二者共同的特性在于必须存在一种跳出机制:循环必有break,而递归必有对最简单情况的直接求解的返回。...我们首先看一下基本定义: 循环循环是程序设计语言中反复执行某些代码的一种计算机处理过程,常见的有按照次数循环和按照条件循环递归:程序调用自身的编程技巧称为递归,必须包括自调用和跳出条件。...而这个定义在逻辑上其实有两层理解: 循环递归的数理逻辑 在人脑概念层面,循环是一个结构类似对象的序列,本身是一个线性结构,没有纵深的层次嵌套。...循环递归的程序逻辑 上面是人脑对循环递归结构的抽象理解。然而所谓放心地解决,是指的只要把问题逻辑理清楚,转化为循环或者递归逻辑就能够写成代码执行,但执行本身是编译器的事,高级语言可以不关心。...故有些编译器会自动把递归等价成循环,可以证明,递归循环之间是可以相互转换的。只不过把部分编译器的工作在高级语言中自己代替而已。

    1.3K21

    Neo4j常用查询语句

    Cypher使用match子句查询数据,是Cypher最基本的查询子句。在查询数据时,使用Match子句指定搜索的模式,这是从Neo4j数据库查询数据的最主要的方法。...在查询数据时,查询语句分为多个部分,with子句用于对上一个查询部分的结果进行处理,以输出到下一个查询部分。...一、节点查询 对节点进行查询,是查询graph的基本操作,节点具有标签和属性,Match查询不仅能够按照标签对节点进行查询,还能按照属性对节点进行查询。...查询所有节点 仅仅指定一个节点的模式,没有标签(Lable)和属性,表示查询所有的节点。 MATCH (n) RETURN n 2....查询相关的特定节点 指定一个节点,查询跟节点相关的节点,并指定相关节点的标签。

    2.6K20
    领券