我的主要问题是:「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中是否可以执行类似的操作?(我认为这可能很难,因为它将涉及“交错”边缘和节点,只是一种直觉)