使用Cypher找到Neo4j中最大的模式路径

时间:2016-03-22 17:33:57

标签: neo4j cypher graph-databases

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

节点标签

问题 结果

关系

答案(带有'标题'字段)

我想通过" no"找到所有相互关联的问题。答案,所有人都有"是"回答相同的结果" - 我怀疑我的数据库中有数百个这样的组,有些只是两个节点,有些节点最多有5个或6个节点。没有大于六。

所以我可以在2组中匹配nos加入的所有答案:

(结果)< - ; [无] - GT; [是] - - (问题)GT(问题) - > [是] - GT;(结果)

但我无法弄清楚如何将其应用于3组或4组。我想我也许可以直截了当地说:

(问题)< - [no] [0 .. *] - (问题) - 找到所有由nos加入的问题,然后在WHERE子句中添加类似WHERE 的所有匹配问题指向 - >结果 - 但我不知道如何在密码中表达

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

[RE-RE-EDITED]

这可能适合你。

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;

NOT (...)子句中的WHERE字词用于确保我们仅使用最长的有效序列Questions

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

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