首页
学习
活动
专区
工具
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 服务器。
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

3分19秒

26.把递归重试改成循环重试

18分0秒

golang教程 go语言基础 54 递归VS循环:优劣比较 学习猿地

20分2秒

45、商品服务-API-三级分类-查询-递归树形结构数据获取

35分12秒

day17【权限管理功能】/14-尚硅谷-谷粒学院-权限管理-查询所有菜单(递归)

7分11秒

day17【权限管理功能】/15-尚硅谷-谷粒学院-权限管理-查询所有菜单(递归)

6分6秒

普通人如何理解递归算法

领券