Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Graph 用Cypher从Neo4j图中提取子图_Graph_Neo4j_Cypher - Fatal编程技术网

Graph 用Cypher从Neo4j图中提取子图

Graph 用Cypher从Neo4j图中提取子图,graph,neo4j,cypher,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); 然而,这种查询既冗余又低效;它必须遍历集合中的每个节点排列

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

下面是我所说的“子图”的一个例子:


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

对查询的这种修改有助于减少数组的冗余

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

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

我想扩展Richards answer,您还可以将其限制为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);
在[3,4,5,6,7]中匹配(n),其中id(n)
匹配p=(n)-->(m)
其中[3,4,5,6,7]中的id(n)
导致


除非我弄错了,否则这个查询只是稍微改进了语法。它对性能有任何帮助吗?@ShreyGupta:你没有弄错,它只是改进了语法。仅当查询保存在脚本中且查询更复杂时,它才有帮助。然后你可以在一个地方编辑脚本。回答得好。7和4之间的关系难道不会消失吗?我的意思是在表格结果中,而不是在浏览器的可视化中。嘿,迈克尔,这是目前从Neo4j获取子图最有效的方法吗?或者有没有其他方法可以在不尝试每个节点组合的情况下实现这一点?我只是担心,对于大约50-100个节点的情况,这可能无法很好地发挥作用。