我主要想问这个问题:“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 中,从概念上讲,我将混合边缘和节点并使用 CLUSTER 子句对数据进行物理排序,在 ArangoDB 中可以做类似的事情吗?(我认为这会很困难,因为它涉及到“交错”边缘和节点,这只是一种直觉)