我有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..
,因此也可以返回由母根节点组成的路径。