在 Neo4j 中,递归查询通常用于处理图中的循环或路径查找问题。Cypher 查询语言提供了 MATCH
和 WITH
语句的组合来实现递归查询。特别是,apoc.path.expandConfig
是一个非常强大的 APOC(Awesome Procedures On Cypher)库函数,可以用于复杂的路径扩展和递归查询。
假设你有一个社交网络图,其中节点表示用户,关系表示朋友关系。你想找到从某个用户开始的所有朋友,朋友的朋友,等等,直到一定的深度。
MATCH
和 WITH
你可以使用 MATCH
和 WITH
语句来实现递归查询。以下是一个示例,查找从某个用户开始的所有朋友,直到深度 3。
MATCH (start:User {name: 'Alice'})
CALL apoc.path.expandConfig(start, {
relationshipFilter: 'FRIEND',
minLevel: 1,
maxLevel: 3
}) YIELD path
RETURN path
apoc.path.expandConfig
apoc.path.expandConfig
是一个非常灵活的函数,可以配置多种路径扩展选项。以下是一个更详细的示例:
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: 1
和 maxLevel: 3
指定了递归的最小和最大深度。uniqueness: 'NODE_GLOBAL'
确保每个节点在全局范围内只被访问一次。在处理图中的循环时,确保使用适当的唯一性设置,以避免无限循环。apoc.path.expandConfig
提供了多种唯一性选项:
NODE_GLOBAL
:全局唯一性,每个节点只访问一次。NODE_PATH
:路径唯一性,每个节点在每条路径中只访问一次。RELATIONSHIP_GLOBAL
:全局关系唯一性,每个关系只访问一次。RELATIONSHIP_PATH
:路径关系唯一性,每个关系在每条路径中只访问一次。MATCH (start:User {name: 'Alice'})
CALL apoc.path.expandConfig(start, {
relationshipFilter: 'FRIEND>',
minLevel: 1,
maxLevel: 3,
uniqueness: 'NODE_GLOBAL'
}) YIELD path
RETURN path
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 库,可以通过以下步骤安装:
plugins
目录中。neo4j.conf
文件,启用 APOC:dbms.security.procedures.unrestricted=apoc.*
领取专属 10元无门槛券
手把手带您无忧上云