如何优化ArangoDB中的图遍历?

Rap*_*aud 13 graph-databases arangodb aql

我主要打算问这个问题:"ArangoDB是真正的图形数据库吗?"

但是,这个问题听起来很冒犯.

你们,triAGENS的人们在创建"多范式"数据库方面做得非常出色.作为PostgreSQL,PostGIS,MongoDB和Neo4J/Titan的用户,我真的很高兴看到"一体化"的解决方案:)

但问题仍然存在,基本上在ArangoDB中创建图形需要创建两个独立的集合:一个用于边缘,一个用于顶点,因此,据我所知,它已经意味着顶点和相关边缘不是"物理"邻居.

而且,即使在创建了适当的索引之后,我在Gremlin中做这种事情时也面临着一些严重的性能问题

g.v('an_id').out('likes').in('likes').count()
Run Code Online (Sandbox Code Playgroud)

在~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)
Run Code Online (Sandbox Code Playgroud)

这给了我一个相同数量级的延迟.

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

所以在我看来,ArangoDB图形功能是"传统文档数据库"之上的"智能图层",但ArangoDB不是"本机"图形数据库.

为了证实这种感觉,我转换数据以在PostgreSQL中加载它并运行一个查询(你可以假设有一个多表JOIN)并得到类似的(对ArangoDB)执行延迟

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

有没有办法优化数据库以获得更好的遍历时间?

在PostgreSQL中,从概念上讲,我会混合使用edge和node并使用CLUSTER子句对数据进行物理排序,在ArangoDB中可以做类似的事情吗?(我认为它会很难,因为它会涉及"交错"边缘和节点,只是一种直觉)

mch*_*cki 5

我是ArangoDB的核心开发人员.您能否根据您使用的数据维度向我提供更多信息?

  • 顶点数量
  • 边缘量

然后我们可以创建具有相同尺寸的自己的设置并进行优化.

  • 除了图形的默认索引之外,我们还没有提供其他图形特定的索引,但计划在将来添加它们.例如,我们的路线图上有一个以顶点为中心的索引,它允许为每个顶点存储长度为n的路径的索引,其中n的最大大小是可配置的.这将为遍历提供大量性能提升.如果您需要某些内容或对索引有其他想法,请告诉我们,以便将它们添加到数据库中. (4认同)
  • 链接到数据集:https://www.dropbox.com/s/fec6bii624c2lfy/imdbdata.tar.gz在您的查询中,将"likes"替换为"ACTS_IN",将起始节点"858"替换为Bruce Willis.要导入数据,您必须创建文档集"imdb_vertices"和边集合"imdb_edges",然后您可以使用arangoimp将数据加载到arangodb中. (3认同)
  • 您好我使用imdb数据集db.vertices.count()= 63027,db.edges.count()= 225060尝试了类似的查询.所以尺寸非常相似.(计数最多返回3000,具体取决于起始节点.).在我的时间测量中,我得到的请求时间低于0.3秒(如果我事先没有加载集合,它大约是3秒,但是在生产集合中总是加载,只设置默认索引).您可以在您的机器上试用我们的数据集并告诉我们您是否得到相同的结果? (2认同)
  • 事实上,分布图(和遍历)是我们今年的路线图.我们必须首先完成"一般"分片. (2认同)