Neo4j具有停止条件的树结构

时间:2016-09-09 15:48:19

标签: neo4j cypher graph-databases

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

我想从root开始,然后向下收集所有节点。当我发现类型(属性)“女性”的节点时,我想将其包含在结果中并停止下降。

Here is my try to describe the problem and expected result

注意:

  • 节点之间存在称为“关系”的关系。每个节点都有 只有1个父母,所以它是树状结构。

到目前为止,我有:

  

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

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

如何实现结果?

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

2 个答案:

答案 0 :(得分:2)

这里有两个选择,真的。容易的就像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的关系比节点标签或节点属性要快得多,因此设计你的关系以适应你想要执行的分析。

答案 1 :(得分:1)

[EDITED]

这对你有用吗?

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

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