具有停止条件的 Neo4j 树结构

Neo4j Tree structure with stop condition

我有 Neo4j 版本 3.0.4,里面有基于树的数据,我正在尝试为以下问题找到解决方案:

我想从根开始,向下移动收集所有节点。当我找到 (属性) "female" 类型的节点时,我想将它包含在结果中并停止下降。

Here is my try to describe the problem and expected result

备注:

到目前为止我有:

match p=(root:User {isRoot:true})-[:RELATION*..]-(child:User) return p

其中return树形结构但没有停止条件

怎样才能达到这个效果?

更新 1: 也许描述期望结果的更好方法是 - 我希望树中的每个节点都深入并从根(或特定节点)开始,没有女性类型的直接或间接父节点。这有意义吗?

[已编辑]

这对你有用吗?

MATCH p=(root:User {isRoot:true})-[:RELATION*0..]-(:User {type: 'male'})-[:RELATION]-(:User {type: 'female'})
RETURN p;

此查询应该 return 所有从根节点开始到女性节点结束的路径,但不经过任何其他女性节点。我假设非女性节点具有 "male" 作为 type 值。可变长度关系模式指定 0.. 以便由女性根节点组成的路径也可以 returned。

你真的有两个选择。简单的方法是按照 InverseFalcon 的建议去做并获得所有结果,然后使用谓词 p运行e:

MATCH (root:User {isRoot: true})
WITH root
MATCH p = (root) - [:RELATION*] -> (:User {type: 'female'} )
WHERE ALL(x IN NODES(p)[1..-1] WHERE x.type = 'male')
RETURN NODES(p)

更难但更好的方法是重构数据模型,而不是通用的 -[:RELATION]->,您有计划查询的特定关系类型(例如 :DAUGHTER|:SON)。查询 neo4j 中的关系比节点标签或尤其是节点属性快得多,因此请设计您的关系以适应您要执行的分析。