用Cypher从Neo4j图中提取子图

时间:2015-04-10 23:02:50

标签: graph neo4j cypher

假设我在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)来获取这些节点形成的子图?

以下是“子图”的含义示例: I want Cypher to return all the relationships marked in green. Please note that the nodes in the collection don't have to be isolated from the rest of the graph; they can still have relationships with other nodes in the graph, but I want Cypher to return only the interactions in green.

我希望Cypher返回所有标记为绿色的关系。请注意,集合中的节点不必与图表的其余部分隔离;他们仍然可以与图中的其他节点建立关系,但我希望Cypher只返回绿色关系。

2 个答案:

答案 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);

结果

enter image description here

答案 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);

您可以使用节点标签或关系类型进行区分(最终子图)和高效查询,但这取决于您的情况。