[英]How to optimize graph traversals in ArangoDB?
我主要打算问这个问题:“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数据库上运行相同的查询(使用相同的数据),查询几乎立即返回(感知时间:<200ms)
所以在我看来,ArangoDB图形功能是“传统文档数据库”之上的“智能图形层”,但ArangoDB不是“本机”图形数据库。
为了证实这种感觉,我转换数据以在PostgreSQL中加载它并运行一个查询(你可以假设有一个多表JOIN)并得到类似的(对ArangoDB)执行延迟
我做错了什么(在AQL查询中)?
有没有办法优化数据库以获得更好的遍历时间?
在PostgreSQL中,从概念上讲,我会混合使用edge和node并使用CLUSTER子句对数据进行物理排序,在ArangoDB中可以做类似的事情吗? (我认为它会很难,因为它会涉及“交错”边缘和节点,只是一种直觉)
我是ArangoDB的核心开发人员。 您能否根据您使用的数据维度向我提供更多信息?
然后我们可以创建具有相同尺寸的自己的设置并进行优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.