如何使用 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')
)
在询问有关 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]
这是我的简化图表模式,
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')
)
在询问有关 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]