【问题标题】:Vertex Centric Indexes for sorting用于排序的顶点中心索引
【发布时间】:2017-12-18 08:47:20
【问题描述】:

假设我有很多边的超级节点,并且想快速返回给定节点的前 N ​​条边。如何使用 arangodb Vertex Centric Index https://docs.arangodb.com/3.1/Manual/Indexing/VertexCentric.html 做到这一点?

我可以创建skiplist Vertex Centric Index

arangosh> db.collection.ensureIndex({ type: "skiplist", fields: [ "_from", "points" ] })

但优化器不会通过排序查询来获取它

FOR edge IN collection
  FILTER edge._from == "vertices/123456" 
  SORT edge.points DESC
  LIMIT 0, 10
  RETURN edge

似乎 arango 优化器不会在遍历语法中选择 skiplist Vertex Centric Index 但是文档说它应该:

FOR v, e, p IN 3..5 OUTBOUND @start GRAPH @graphName
  FILTER p.edges[*].points ALL >0
  RETURN v

【问题讨论】:

  • 如果将遍历深度更改为1..51..1,它是否拾取索引?
  • 不。它没有
  • 请在 GitHub 上报告:github.com/arangodb/arangodb/issues/new。包括软件版本,如果可能的话,包括数据集。使用具有特定值分布的完全相同的数据可能很重要,因为基于选择性估计,顶点中心索引并不总是优于默认边缘索引。

标签: graph-databases arangodb


【解决方案1】:

快速返回给定节点的前 N ​​条边

最好从节点开始:

FOR v, e IN 1..1 ANY @start @edges
  SORT e.points DESC
  LIMIT 10
  RETURN e

这应该与 ArangoDB 的当前版本 (3.3) 一样好,假设您让 ArangoDB 索引 _from - 我怀疑为 .points 添加一个跳过列表会产生任何(有益的)区别,除非你在过滤器中使用它。

(我认为在这里使用跳过列表索引 _from 是不明智的。如果 edges 是 Edges 集合,那么它已经被正确索引了。)

【讨论】:

  • 不幸的是,它不能那样工作。使用标准边索引,它可以非常快速地找到给定节点的所有边,但随后它必须对它们中的每一个进行迭代和排序。如果是超级节点,可能需要几秒钟。
  • @Ruslan - 我试图澄清我的答案。如果您可以添加过滤器(例如 .points > 0),那么这当然可能会有所帮助。你能告诉我们有问题的节点有多少条边,你的各种查询需要多长时间,以及我提出的查询需要多长时间?
猜你喜欢
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多