在单个cypher查询中组合深度和广度优先遍历

时间:2014-02-11 07:16:16

标签: neo4j cypher

我的图是一个树结构,包含根节点和结束节点,以及它们之间的一系列节点,从一个到另一个节点之间具有[:NEXT]->个关系。沿该路径的某些节点也与其他根节点具有[:BRANCH]->关系,并通过它们与其他节点线相关。

Cypher查询将从开始到结束返回路径上节点的有序列表,并且包含它们的节点的记录中包含任何BRANCH关系?

编辑:这不是技术图表,但基本结构如下:

enter image description here

将每个节点描绘为黑色圆圈。在这种情况下,我希望这里描述的每个节点。

3 个答案:

答案 0 :(得分:6)

怎么样

MATCH p=(root)-[:NEXT*0..]->(leaf)
OPTIONAL MATCH (leaf)-[:BRANCH]->(branched)
RETURN leaf, branched, length(p) as l
ORDER BY l ASC

另请参阅此图表:http://gist.neo4j.org/?9042990

答案 1 :(得分:1)

这个查询 - 有点慢 - 应该可以工作(我猜):

START n=node(startID), child=node(*)
MATCH (n)-[rels*]-(child)
WHERE all(r in rels WHERE type(r) IN ["NEXT", "BRANCH"])
RETURN *

这是基于Neo4j 2.0.x Cypher syntax 从技术上讲,此查询将在从startID开始的树的末尾停止:这是因为上图中的末尾属于单个路径,但不属于所有分支的末尾。 我还建议限制关系的基数 - [rels*1..n] - 以防止查询消失......

答案 2 :(得分:1)

除非您有一个变量来保存以前的元素或递归调用的类型,否则您将无法控制按照深度优先或广度优先算法返回节点的顺序,我认为这不仅仅是使用Cypher

你能做什么

MATCH p =(n)-[:NEXT*]->(end) 
WITH collect(p) as node_paths
MATCH (n1)-[:NEXT]->(m)-[:BRANCH]->(n2)
WITH collect(m) as branch_nodes , node_paths
RETURN branch_nodes,node_paths

现在node_paths包含所有带有模式(node)-[:NEXT]->(node)-[:NEXT]->...(node)的路径。现在你有了路径和分支节点(基本上是node_paths中所有路径的起点,除了将从root节点出现的路径之外),你可以相应地安排输出顺序。