【问题标题】:Find largest path featuring pattern in Neo4j with Cypher使用 Cypher 在 Neo4j 中查找具有模式的最大路径
【发布时间】:2016-03-22 17:33:57
【问题描述】:

我有以下节点类型,以及要查找的模式:

节点标签

问题 结果

关系

答案(带有“标题”字段)

我想“找到所有通过“否”答案相互关联的问题,并且对相同结果都有“是”答案”-我怀疑我的数据库中有数百个这样的组,有些只是两个节点大小,有的多达 5 或 6 个节点。不超过六个。

所以我可以匹配 2 组中所有由 nos 连接的答案:

(结果)[否]->(问题)->[是]->(结果)

但我不知道如何将其应用于 3 或 4 组。我想我也许可以直截了当:

(question)所有匹配的问题指向 -> 结果 - 但我不知道如何用密码表达它

谁能帮忙?

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    [重新编辑]

    这可能对你有用。

    MATCH p=(oc:Outcome)<-[:Answer {title: 'yes'}]-(q1:Question)-[:Answer* {title: 'no'}]->(q2:Question)-[:Answer {title: 'yes'}]->(oc)
    WHERE
      NOT (
        (oc)<-[:Answer {title: 'yes'}]-(:Question)-[:Answer {title: 'no'}]->(q1) OR
        (q2)-[:Answer {title: 'no'}]->(:Question)-[:Answer {title: 'yes'}]->(oc)
      ) AND
      ALL(q IN NODES(p)[1..-1] WHERE (q)-[:Answer {title: 'yes'}]->(oc))
    RETURN oc, NODES(p)[1..-1] AS questions;
    

    WHERE 子句中的NOT (...) 术语用于确保我们只使用Questions最长 有效序列。

    每个结果行都包含一个共享结果和一个有序的问题节点集合。

    此查询可能需要很长时间才能完成,因为它没有指定可变长度模式的上限。如果这是一个问题,您可能需要指定一个适当的上限(例如,Answer*..5)。

    【讨论】:

    • 标记为答案,因为这对我有很大帮助,谢谢!我遇到的问题是“中间”问题(rels:Answer *)也需要与结果(oc)有“是”关系 - 目前看起来它只是在任一端强制执行“是”关系
    • 我已经更新了我的答案,它现在应该确保所有其他关系都有“无”标题(我相信这是你在问题中所说的)。
    • 我重新编辑了我的答案,现在我想我明白你真正想要什么了。
    • 我们只是对如何仅找到“包含特定问题的最长路径”感到困惑-我想我会在此处发布它以防我们最终什么也没找到此查询匹配'4-问题组'例如[Q1,Q2,Q3,Q4] 但您也会在结果中得到 [Q1,Q2], [Q2,Q3], [Q3,Q4] - 能够说“只有显示具有特定问题 ID 的最长组”。我认为问题不可能出现在多个组中。返回如下: RETURN oc, extract(n IN questions| n.id) AS extract, size(questions) AS noOfQuestions ORDER BY noOfQuestions DESC
    • 您的同事也可以投票(如果他们有足够的分数):-)。无论如何,我已经重新编辑了我的答案。我没有测试过它,但它应该只给你最长的有效问题链。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 2016-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多