在大图中获取特定路径的起点和终点

时间:2020-07-10 10:05:54

标签: neo4j cypher

我有一个大图(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的第一个查询时,它可以通过并返回所需的输出,但是当我尝试执行第二个查询时-即使我将id_list减小到20,000,图也会卡住。 / p>

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

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

1 个答案:

答案 0 :(得分:1)

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