【问题标题】:Querying in Gremlin using multiple indices使用多个索引在 Gremlin 中查询
【发布时间】:2013-07-05 16:07:39
【问题描述】:

我正在尝试在 Neo4J 图上优化 Gremlin 中的请求。

这是我正在使用的基本请求的简短版本:

g.idx("myIndex")[[myId:5]].outE("HAS_PRODUCT").filter{it.shop_id:5}.inV

所以我研究了索引,并使用键 'shop_id'"HAS_PRODUCT" 类型的边上创建了一个索引。

使用相同的请求,我看不出有什么大的不同。

我的问题是:

  • 当我查询时是否使用了我的新索引:filter{it.shop_id:5}

  • 如果没有,我如何在我的请求中使用这个新索引?

  • 更一般地说,如果idx( 是使用索引的图形方法,那么是否有管道方法呢?

谢谢!

【问题讨论】:

  • 我意识到我的回答并没有完全涵盖您的所有问题。要完全回答,我有一个自己的问题。在这种特殊情况下,您知道shop_id 的 ID,它是一个边索引。既然你知道那个值,最好从那里开始你的遍历,因为你知道更有限的 inV/outV 集(我假设myId:5 有很多边)?跨度>
  • 我实际上缩短了我的查询,但主要方案是上面的那个,完整的查询有2个过滤器,总遍历大约5条边。 myId:5 没有太多边,它对应一个产品列表。然而,g.idx("by_shopid")[[shop_id:5]] 有很多传入的"HAS_PRODUCT" 关系。如果我想在该商店中获得与该列表中的产品相对应的产品,我需要从列表遍历到商店(或相反)。从在shop_id 上带有索引请求的商店开始将生成孔商店目录,我仍然需要遍历我的列表

标签: neo4j gremlin


【解决方案1】:

简短的回答是 Gremlin 在使用 Neo4j 时不会使用二级索引,但请考虑阅读下面有关 TinkerPop、Gremlin 及其理念的较长答案。

更长的答案是....您的shop_id 没有使用索引。当您调用outE 时,您实际上是在迭代所有边缘以找到具有shop_id == 5 的边缘。要在 Gremlin 中使用索引,您应该使用 vertex query。所以,稍微重写一下你的代码(也可以使用key indices)就像:

g.V('myIndex',5).outE('HAS_PRODUCT').has('shop_id',5).inV

对于支持以顶点为中心的索引的蓝图实现,使用has 将自动利用该索引。不幸的是,Neo4j 还不是这些数据库之一。在这种情况下,实现它的蓝图实现包括 Titan(请参阅Vertex-centric indices)和 OrientDB(作为尚未发布的蓝图 2.4.0 的一部分......我相信他们将在该版本中部分实现)。

【讨论】:

  • 我将在这里稍微偏离主题,但 Neo4j 蓝图实现中是否有任何类型的 ETA 支持以顶点为中心的索引?即使没有一个明确的日期,只是知道它正在考虑吗?谢谢
  • 这真的不是蓝图发布时间表的问题。我认为 Neo4j 目前没有任何可用的功能可以利用 Blueprints 公开的顶点查询 API。无法原生利用 Vertex Query 的蓝图实现获得对该功能的“简单”支持,因为它们遵循默认的内存处理器 (github.com/tinkerpop/blueprints/blob/master/blueprints-core/src/…),最终迭代所有结果。
  • @stephen 感谢您的回答!我实际上是在此页面上查看此内容:link 并且无法使用 has 方法重现查询时间增益。这应该会促使人们向 Titan 迁移。
  • Neo4j 从 2.1 版开始按标签和方向对边进行分组:java.dzone.com/articles/neo4j-210-milestone-1-release
猜你喜欢
  • 1970-01-01
  • 2015-07-06
  • 1970-01-01
  • 1970-01-01
  • 2021-12-13
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
相关资源
最近更新 更多