如何优化路径查询的速度

  • nebula 版本:2.6.1
  • 部署方式:分布式
  • 安装方式:RPM
  • 硬盘 500G x 2
  • CPU 16G x 2
  • 内存 64G x 2

当前的使用场景为

TAG上方的数据为该tag的数量级。

当前已知一些TAG4的信息,想要获得从TAG4出发的,形如:TAG1 → TAG2 → TAG3 → TAG5 → TAG6 的所有路径。

当前使用的代码为:

$tag1 = GO 2 STEPS FROM TAG4 OVER edge4, edge2 YIELD edge2._dst AS tag1_id;
$tag6 = GO 2 STEPS FROM TAG4 OVER edge6, edge7 YIELD edge7._dst AS tag6_id;
FIND NOLOOP PATH FROM $tag1.tag1_id TO $tag6.tag6_id OVER edge1, edge3, edge5, edge7 UPTO 4 STEPS | YIELD properties(nodes($-.path)[2]).name AS name

当然我们实际上返回的属性值非常多,几乎包括了该条路径的全部节点。目前这样的语句在我们的测试环境中运行速度极慢,查询并没有成功返回过结果。之前了解到 nebula 使用的是 BFS 搜索,请问是否是由于我的模型中 TAG3 的数据量过大导致的查询结果慢,如果可以的话,是否有推荐的数据建模格式?

2 个赞

tag1 有100多个点, tag6有10000多个点, 并且找全路径,如果边的联通度比较高的话,数据量是很大的, 没有返回过结果是 超时了,还是内存爆了
如果超时了 可以在 nebula-graph.conf 中将 storage_client_timeout_ms 设置大一点
如果内存爆了, 可以 dmesg -T|grep nebula 确定一下

1 个赞

没有返回结果是超时,理论上来说最终返回的结果数量应该在40000左右,所以我们怀疑查询这么慢是不是我们的建模和路径搜索方式之间不匹配,想问一下官方有没有推荐的一些图建模方式。

(另:查询时间对我们来说非常关键,我们希望查询尽可能快,最好是秒级,但是我们返回的数据量在数量(路径的个数)和内容(路径上的信息)都比较大,这种情况下官方是推荐将信息作为属性放在 tag 中还是独立出来作为 tag 呢?)

1 个赞

返回结果40000 , 但是可能中间产生的数据是很多的, 可以确定一下,从 tag1 到tag2 有多少关联的边
从tag2 到tag3 有多少关联的边, tag3到tag5 的边数, tag5到tag6的边数

属性信息非常多的话,建议独立出来, 否则的话,数据序列化加传输会占用很多时间

1 个赞

此话题已在最后回复的 30 天后被自动关闭。不再允许新回复。