【问题标题】:Neo4j Tree structure with stop condition具有停止条件的 Neo4j 树结构
【发布时间】:2016-09-09 15:48:19
【问题描述】:

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

我想从根目录开始向下收集所有节点。当我找到类型(属性)“女性”的节点时,我想将其包含在结果中并停止下降。

Here is my try to describe the problem and expected result

注意事项:

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

到目前为止,我有:

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

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

怎样才能达到效果?

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

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案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 中的关系比节点标签或节点属性查询要快得多,因此请设计您的关系以适应您要执行的分析。

    【讨论】:

    • 这似乎很有效。我想探索与关系的第二个选项,但稍微改变一下要求。假设我们没有类型,只有年龄,如果年龄大于 70,那么我们就停止。例如MATCH (root:User {userId:'some-id'}) WITH root MATCH p = ((root)-[:RELATION*]->(u:User)) WHERE u.age > 0 and ALL(x IN NODES(p)[1..-1] WHERE x.age < 70) RETURN u.userId我们可以通过关系实现这一点吗?是否更好?
    • 如果你定义了正确的关系,你几乎可以通过关系实现任何事情。
    • 第一个例子变成:MATCH p = (root) -[:SON*]->()-[:DAUGHTER]->() RETURN LAST(NODES(p)) 第二个就像:MATCH p = (root) - [:KNOWS*]->()-[:RESPECTS]->() RETURN LAST(NODES(p)) 问题变成了,你的问题真的适合图表数据库吗?您的问题越需要对属性进行详细分析(例如年龄
    【解决方案2】:

    [编辑]

    这对你有用吗?

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

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

    【讨论】:

    • 这实际上不会过滤所有具有女性类型的节点的结果。目标是返回男性和女性,并在有女性时停止深入,但仍然包括它。在图像中检查 A2 是男性(包括),B2 是女性(包括)和 C2 是男性,但不应该包括在内,因为 B2 是女性。
    • 我认为更新不会对输出产生太大影响。如果(:User{type:'male'})-[:RELATION]-(:User{type:'female'}) 出现两次,变量关系仍然会在两次出现时都匹配。我认为您不会导致变量匹配像这样停止。我认为您最多可以做的是添加一个谓词来修剪结果,以确保匹配中的节点中只有一个女性:用户存在(不包括节点的头部,因为根用户可能是女性)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多