带有停止条件的Neo4j树结构



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

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

下面是我对问题和预期结果的描述

指出:

  • 节点之间的关系称为"关系"。每个节点都有只有一个父节点,所以是树形结构。

到目前为止,我有:

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

返回树形结构,但没有停止条件

怎样才能达到这个结果?

更新1:也许描述期望结果的更好的方法是——我希望树中的每个节点都从根(或特定节点)开始深入,并且没有直接或间接的雌性父母。明白了吗?

这里实际上有两个选择。最简单的方法是按照InverseFalcon的建议,获取所有结果,然后使用谓词进行修剪:

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中查询关系比查询节点标签或节点属性要快得多,所以要设计您的关系以适应您想要执行的分析。

[edit]

这个对你有用吗?

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

此查询应返回从根节点开始并以母节点结束的所有路径,但不经过任何其他母节点。我假设非女性节点具有"男性"作为type值。变长关系模式指定了0..,因此也可以返回由母根节点组成的路径。

最新更新