Neo4j:如何在图中对节点进行广度优先搜索

Neo4j: How to query in a breadth first search of nodes in a graph

我在 neo4j 中得到了一个图模型,只有一个关系如下:

(node1)-[:CONNECTS]->(node2)

已尝试以下查询,但它会给我双向结果:

MATCH (n:Label1)-[r:CONNECTS*1..]-(m) 
WHERE n.name = 'startNodeString' 
RETURN n,r,m

下面的查询只会return给定根节点的第一级子节点:

MATCH (cs:Label1)-[r:CONNECTS*]->(es:Label2)
WHERE cs.property = 'startNodeString'
RETURN cs,es,r

我想从根节点开始捕获每个子节点并递归每个子节点直到每个级别的深度,即 'n' 级别。

感谢您对密码查询的帮助。

你需要APOC Procedures for this, specifically path expander.

这是一个使用示例:

MATCH (cs:Label1)
WHERE cs.property = 'startNodeString'
CALL apoc.path.expandConfig(cs,{relationshipFilter:"CONNECTS>",maxLevel:3,uniqueness:"NODE_GLOBAL"}) YIELD path
WITH cs, RELATIONSHIPS(path) as r, LAST(NODES(path)) as es
WHERE es:Label2
RETURN cs,es,r

所有路径扩展器调用默认使用 bfs。 NODE_GLOBAL 唯一性意味着节点只会被遍历一次。您可以将 maxLevel 设置为您想要的任何深度限制,或者完全忽略它。

您可以使用 Neo4j Graph Data Science algorithm Breadth First Search.

按照上面的指南,首先创建一个 projected graph(基本上它是使算法更快 运行 的同一张图)

CALL gds.graph.create('myGraph', 'Node', 'REL', { relationshipProperties: 'cost' })

然后使用算法本身:

MATCH (a:Node{tag:'a'})
CALL gds.alpha.bfs.stream('myGraph', {startNode: id(a)})
YIELD path
RETURN path

结果是这样的: