如何使用 gremlin 查询表达多个 属性 集节点选择条件

How to express multiple property set criteria for node selection using gremlin query

这是我的简化图表模式,

package:
  property: 
   - name: str (indexed)
   - version: str (indexed)

我想在单个查询中使用多组 属性 条件来查询版本。我可以将 within 用于单个 属性 的列表,但如何对多个属性执行此操作?

假设我有 10 个 package 个节点,(p1,v1, p2,v2, p3,v3,.. p10,v10)

我想 select 只有 个节点 (p1 with v1, p8 with v8, p10 with v10)

有没有办法处理单个 gremlin 查询?

相当于SELECT * from package WHERE (name, version) in ((p1,v1),(p8,v8),(p10,v10))

这可能不是最 "creative" 的方式,

但我认为最简单的方法是使用 or:

g.V().or(
    hasLabel('v1').has('prop', 'p1'),
    hasLabel('v8').has('prop', 'p8'),
    hasLabel('v10').has('prop', 'p10')
  )

示例:https://gremlify.com/6s

在询问有关 Gremlin 的问题时,最好提供一些示例数据。我假设这是您的模型的近似值:

g.addV('package').property('name','gremlin').property('version', '1.0').
  addV('package').property('name','gremlin').property('version', '2.0').
  addV('package').property('name','gremlin').property('version', '3.0').
  addV('package').property('name','blueprints').property('version', '1.0').
  addV('package').property('name','blueprints').property('version', '2.0').
  addV('package').property('name','rexster').property('version', '1.0').
  addV('package').property('name','rexster').property('version', '2.0').iterate()

我不认为有一种方法可以比较成对的输入并期望索引命中。因此,您必须执行通常在图表中执行的操作,并在内存中过滤之前选择索引以最好地缩小结果范围。我假设在你的情况下这将是“名称”属性,因此首先获取那些然后过滤对:

gremlin> g.V().has('package','name', within('gremlin','blueprints')).
......1>   elementMap().
......2>   where(select('name','version').is(within([name:'gremlin',version:'2.0'], [name:'blueprints',version:'2.0'])))
==>[id:3,label:package,name:gremlin,version:2.0]
==>[id:12,label:package,name:blueprints,version:2.0]