假设我在Neo4j中有5个节点的集合,这样集合中的每个节点都连接到集合中的至少一个其他节点。我想从Neo4j中提取由节点集合及其交互形成的子图。目前,我正在使用一种非常原始的方法,包括尝试从系统中的每个节点到每个其他节点找到匹配项:
MATCH p=(n)-[]->(m)
WHERE id(n) IN [3,4,5,6,7] AND id(m) IN [3,4,5,6,7]
RETURN relationships(p);
然而,这个查询既冗余又低效;它必须经历集合中节点的每个排列(例如,它将匹配节点#3和#4,以及#4和#3)。有没有更有效的方法来使用Cypher ONLY(没有Java)来获取这些节点形成的子图?
以下是“子图”的含义示例:
我希望Cypher返回所有标记为绿色的关系。请注意,集合中的节点不必与图表的其余部分隔离;他们仍然可以与图中的其他节点建立关系,但我希望Cypher只返回绿色关系。
答案 0 :(得分:3)
我想扩展Richards的答案,你也可以将它限制在id为不同组的节点。
MATCH (n) WHERE id(n) IN [3,4,5,6,7]
MATCH p=(n)-->(m)
WHERE id(n) < id(m) AND id(m) IN [3,4,5,6,7]
RETURN relationships(p);
结果
答案 1 :(得分:0)
对查询的这种修改有助于数组的冗余。
WITH [3,4,5,6,7] AS arr
MATCH p=(n)-[]->(m)
WHERE id(n) IN arr AND id(m) IN arr
RETURN relationships(p);
您可以使用节点标签或关系类型进行区分(最终子图)和高效查询,但这取决于您的情况。