使用 Cypher 在 Neo4j 中查找具有模式的最大路径
Find largest path featuring pattern in Neo4j with Cypher
我有以下节点类型和要查找的模式:
节点标签
问题
结果
关系
答案(带有 'title' 字段)
我想 "find all questions that are connected to each other by " 没有“答案并且所有答案都具有相同结果的 "yes" 答案” - 我怀疑我的数据库中有数百个这样的组,有些只是两个节点大小,有些多达 5 或 6 个节点。 None 大于六。
所以我可以匹配 2 组中由 nos 连接的所有答案:
(结果)<-[是]-(问题)->[否]->(问题)->[是]->(结果)
但我不知道如何将其应用于 3 或 4 组。我想我也许可以做一个直线:
(question)<-[no][0..*]-(question) - 找到所有由 nos 连接的问题,然后在 WHERE 子句中添加 WHERE all matched questions 指向 -> 结果 - 但我不知道如何用密码
有人能帮忙吗?
[重新编辑]
这可能适合你。
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
)。
我有以下节点类型和要查找的模式:
节点标签
问题 结果
关系
答案(带有 'title' 字段)
我想 "find all questions that are connected to each other by " 没有“答案并且所有答案都具有相同结果的 "yes" 答案” - 我怀疑我的数据库中有数百个这样的组,有些只是两个节点大小,有些多达 5 或 6 个节点。 None 大于六。
所以我可以匹配 2 组中由 nos 连接的所有答案:
(结果)<-[是]-(问题)->[否]->(问题)->[是]->(结果)
但我不知道如何将其应用于 3 或 4 组。我想我也许可以做一个直线:
(question)<-[no][0..*]-(question) - 找到所有由 nos 连接的问题,然后在 WHERE 子句中添加 WHERE all matched questions 指向 -> 结果 - 但我不知道如何用密码
有人能帮忙吗?
[重新编辑]
这可能适合你。
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
)。