如何优化ArangoDB中的图遍历?

15

我的主要问题是:「ArangoDB 是否真的是一个真正的图形数据库?」

但这个问题可能会听起来有点冒犯。

triAGENS 的团队做了一项非常出色的工作,创建了一个「多范式」的数据库。作为 PostgreSQL、PostGIS、MongoDB 和 Neo4J/Titan 的用户,我非常欣赏能看到一个「一站式」的解决方案 :)

但问题仍然存在,基本上在 ArangoDB 中创建图形需要创建两个单独的集合:一个用于边缘,另一个用于顶点,因此,就我所理解的而言,顶点和相关边缘已经不是「物理上」相邻的了。

此外,即使创建了适当的索引,在 Gremlin 中进行此类操作时我仍然面临一些严重的性能问题。

g.v('an_id').out('likes').in('likes').count()

在约3秒钟后(感知时间),它会返回结果。

我以为自己对Gremlin和Blueprint/ArangoDB的工作方式理解不够,所以我尝试使用AQL重写了相同的查询:

LET lst = (FOR e1 in NEIGHBORS(vertices, edges, "an_id", "outbound", [ { "$label": "likes" } ] )
    FOR e2 in NEIGHBORS(vertices, edges, e1.edge._to, "inbound", [ { "$label": "likes" } ] )
        RETURN 1
    )
RETURN length(lst)

这给了我同等数量级的延迟。

如果我尝试在一个Titan或Neo4j数据库上运行相同的查询(使用完全相同的数据),查询几乎立即返回(感知时间:<200毫秒)。

所以对我来说,ArangoDB图形功能是“传统文档数据库”上面的“智能图形层”,但ArangoDB不是“本地”图形数据库。

为了确认这种感觉,我将数据转换为加载到PostgreSQL中并运行一个查询(可以假设它涉及多个表JOIN),并获得类似于ArangoDB的执行延迟

我在AQL查询中做错了什么吗?

有没有一种方法来优化数据库以获得更好的遍历时间?

在PostgreSQL中,从概念上讲,我会混合边缘和节点,并使用CLUSTER子句对数据进行物理排序,那么在ArangoDB中是否可以执行类似的操作?(我认为这可能很难,因为它将涉及“交错”边缘和节点,只是一种直觉)

1个回答

7

我是ArangoDB的核心开发者。您能否给我更多关于您正在使用的数据尺寸的信息?

  • 顶点数量
  • 边的数量

那么我们就可以创建自己的设置,具有相同的尺寸并进行优化。


2
嗨,我尝试使用IMDB数据集进行了类似于你的查询,db.vertices.count() = 63027,db.edges.count() = 225060。因此维度非常相似。(计数根据起始节点返回高达3000个。)在我的时间测量中,我得到的请求时间低于0.3秒(如果我没有预先加载集合,则大约为3秒,但在生产中,集合始终被加载,只设置默认索引)。您能否在您的机器上尝试我们的数据集,并告诉我们是否获得相同的结果? - mchacki
3
链接数据集:https://www.dropbox.com/s/fec6bii624c2lfy/imdbdata.tar.gz 在您的查询中,将“likes”替换为“ACTS_IN”,初始节点为Bruce Willis的“858”。要导入数据,您需要创建一个文档集合“imdb_vertices”和一条边缘集合“imdb_edges”,然后可以使用arangoimp将数据加载到ArangoDB中。 - mchacki
4
除了默认的图索引之外,我们目前还没有提供其他针对图的特定索引,但我们计划在未来添加它们。例如,我们的路线图上有一个基于顶点的索引,允许为每个顶点存储长度为n的路径索引,其中n的最大大小是可配置的。这将大大提高遍历性能。如果您需要其他类型的索引或者有其他的想法,请告诉我们,以便我们可以将它们添加到数据库中。 - mchacki
2
事实上,分布式图(和遍历)已经在我们今年的路线图上了。不过我们必须先完成“通用”分片。 - mchacki
1
我非常想知道这会引向何方。非常感谢你们提供的全面测试数据。我想采用ArangoDB,但需要在neo4j测试案例中描述的性能特征。我会关注路线图的。 - code_monk
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接