【问题标题】:How to express multiple property set criteria for node selection using gremlin query如何使用 gremlin 查询表示节点选择的多个属性集标准
【发布时间】:2020-07-30 15:54:15
【问题描述】:

这是我的简化图模式,

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

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

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

我想选择 only 具有(p1 with v1, p8 with v8, p10 with v10)的节点

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

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

【问题讨论】:

    标签: neo4j gremlin tinkerpop janusgraph tinkerpop3


    【解决方案1】:

    这可能不是最“有创意”的方式,

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

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

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

    【讨论】:

    • 当我有很多节点时它不起作用。它总是超时。我确实为nameversion 属性设置了索引。
    【解决方案2】:

    在询问有关 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]
    

    【讨论】:

    • 这太完美了!非常感谢@stephen mallette
    • 这不适用于绑定。例如我想查询 10 组输入。
    • 不 - 它不适用于绑定。考虑到您的问题,我的回答实际上很奇怪。我很惊讶我是这样回答的。这几乎就像我以某种方式回答了一个不同的问题。无论如何,我已经完全重写了我的答案。
    • 我想到了另一种技巧,基本上将这两个属性组合为一个。在我的特定用例中,我可以将其组合为 name@version,而不是单独使用 [name, version]。这将允许直接使用within
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2021-01-31
    • 1970-01-01
    • 1970-01-01
    • 2015-04-10
    • 2021-09-05
    相关资源
    最近更新 更多