首页 > 解决方案 > 在大图中获取特定路径的开始和结束节点

问题描述

我有一个大图(1,068,029 个节点和 2,602,897 个关系),我通过 python API 使用它,并在我的程序流中向图发出请求。

我有以下疑问 -

第一次查询

MATCH 
(start_node)--(o:observed_data)--(i:indicator)--(m:malware)--(end_node:attack_pattern)
WHERE start_node.id in [id_list] 
RETURN start_node.id, end_node.name

第二次查询

MATCH 
(start_node)--(o1:observed_data)--(h:MD5)--(o2:observed_data)--(i:indicator)--(m:malware)--(end_node:attack_pattern)
WHERE start_node.id in [id_list] 
RETURN start_node.id, end_node.name

当我尝试使用大小为 75,000 的 id_list 执行第一个查询时,它通过 OK 并返回所需的输出,但是当我尝试执行第二个查询时 - 图形卡住了,即使我将 id_list 减少到 20,000。

id_list 甚至大于 75,000,但我将其拆分为块以使图形的响应时间更快,但如果我将其拆分为太多块,我将增加对图形的请求数,并增加程序运行-时间。

我的问题是 - 是否有某种图书馆的功能(APOC 或类似的东西)可以执行相同的操作但时间更短?或者,也许您有另一个解决方案可以解决这个问题,而不会将 id_list 减少到 50,000 以下?

标签: neo4jcypher

解决方案


  1. (start_node)您的模式中的应该MATCH指定一个标签(如(start_node:Foo)),以避免必须扫描every数据库中的节点。此外,您应该为该起始节点创建一个索引(或唯一性约束)。
  2. 如果合适的话,你应该在你的MATCH模式中建立所有的关系。directional也就是说,在两端放一个箭头。
  3. 您还应该在模式中指定关系类型(如()-[:BAR]->()),以便不会强制查询评估所有关系类型。

推荐阅读