Cyher/Neo4j中递归关系匹配求值顺序的保证

bprjcwpo  于 2022-10-01  发布在  其他
关注(0)|答案(2)|浏览(291)

对于像MATCH (node0 {id: 1})-[:REL*]->(nodeN)这样的比赛,

是否有以下方面的保证:

  • 比赛是深度优先/呼吸优先?
  • 匹配从一个节点到一个关系或另一个关系的分支?

在此基础上进行实验,对于相同的数据集(通过每次以相同顺序创建的实体的集成测试创建),两个Neo4j示例(一个在docker中通过GitHub操作运行,另一个在docker桌面上)似乎具有:

  • 相同的深度优先语义
  • 不同的分支顺序

是否有任何Cypher参数影响1)DFS与BFS行为2)从一个节点的遍历顺序,即基于关系属性

我知道有一些遍历(即树生成)算法可以做类似的事情,但我还不想探究它们,因为它们在属性过滤方面有更多限制(只能按标签过滤)

qni6mghb

qni6mghb1#

我不认为有任何参数可以正确地做这些事情。

1.DFS与BFS->路径匹配仅为DFS。对于查询MATCH (node0 {id: 1})-[:REL*]->(nodeN),第一个密码将以一跳距离获得nodeN。然后,它将从该节点遍历并继续前进。注意这一点的一个好方法是查看以下查询的输出:

MATCH (n{id: 1})-[r:REL*]->(nodeN) return n, nodeN, r
1.我们不能使用某些性质来影响遍历顺序。没有这样的关键字,WHERE子句将过滤出结果,ORDER BY将对最终结果进行排序,但目前没有任何东西可以在内部影响遍历。

lnxxn5zx

lnxxn5zx2#

我不认为你能在纯密码中做到这一点。但是,如果您需要从MATCH获得可预测的结果,您可以尝试使用标识属性(内部ID不适用于您的情况,因为您运行的是两个数据库)

MATCH (p) = (node0 {id: 1})-[:REL*]->(nodeN)
WITH p
ORDER BY length(p), nodeN.ID     // ORDER BY  nodeN.ID,length(p)

所以至少你得到的结果总是以相同的顺序出现。

相关问题