neo4j - 在大图中获取特定路径的开始和结束节点
问题描述
我有一个大图(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 以下?
解决方案
(start_node)
您的模式中的应该MATCH
指定一个标签(如(start_node:Foo)
),以避免必须扫描every
数据库中的节点。此外,您应该为该起始节点创建一个索引(或唯一性约束)。- 如果合适的话,你应该在你的
MATCH
模式中建立所有的关系。directional
也就是说,在两端放一个箭头。 - 您还应该在模式中指定关系类型(如
()-[:BAR]->()
),以便不会强制查询评估所有关系类型。
推荐阅读
- spring - Javax 验证不适用于引导休息控制器参数
- php - constraint() 和 reference() / Laravel 6 之间的区别
- python - Pyhon 检查列表中的所有项目是否都可以是数字
- julia - 用返回多个值的函数的矢量化调用替换 for 循环
- reactjs - setState 不会重新渲染反应功能组件
- c++ - 读取未知字符类型的文件
- python - 即使看起来正确也无法创建表面
- javascript - 我想打印从 0 到 1000 的“i”值
- ruby - logstash 配置循环遍历字段
- html - 为什么我在表格单元格中得到 NaN?(Python - 熊猫)