【问题标题】:Graphdb Gremlin query to find vertices by property value matchGraphdb Gremlin 查询通过属性值匹配查找顶点
【发布时间】:2019-08-04 18:43:10
【问题描述】:

假设 AWS Neptune 属性图中的简单 a graphdb 内容显示在

http://tinkerpop.apache.org/docs/current/reference/#graph-computing

我正在寻找一种纯粹的 gremlin 解决方案,以从参考顶点的属性值集中找到具有至少一个属性值的顶点。该解决方案需要使用给定属性的多个值。即,如果一个顶点至少有一个共同值,则应该找到它。在这个例子中,我们正在寻找与 V(3) 具有相同(在多个值的情况下,至少一个)“lang”属性值的所有顶点。

试过了:

g.V().has('lang', within(V(3).properties('lang')))
g.V().has('lang', within(V(3).properties('lang').value()))
g.V().has('lang', within(V(3).valueMap('lang')))

这些似乎扫描了数据库,但没有返回任何结果。可能 inside() 不是正确的步骤。

最好它需要是单个查询,而不必先读出引用属性值并为其中组装一个字符串列表。 欢迎任何纯粹的 Gremlin 技巧或技术。

【问题讨论】:

    标签: properties find gremlin vertex tinkerpop3


    【解决方案1】:

    我想你的问题的直接答案是这样做:

    gremlin> g.V(3).as('x').V().hasLabel('software').where(neq('x')).where(eq('x')).by('lang')
    ==>v[5]
    

    我说“假设”是因为虽然这种遍历机械地得到了您想要的答案,但您要小心不要在中间遍历 V() 上得到完整的图形扫描。因此,您需要确保您有一个图形数据库,该数据库可以通过某种索引或足够小的数据集来优化此遍历,以便在其上进行搜索。

    【讨论】:

    • 首先,感谢您的快速回复。 Where().by() 似乎有效,但它说:“提供的键存在多个属性,请使用 Vertex.properties(lang)”,除非我将查询更改为 ..where(eq('x'))。通过(属性('lang'))。坏消息是,在您编写时,遍历器无法找到合适的索引(或者因为 where() 步骤它甚至不想这样做——顺便说一下,我正在使用 AWS Neptune DB)所以它最终会执行完整的表扫描,在 1.2TB 数据库上需要 2.5 小时,因此在 has() 步骤中执行 2 次查询和枚举值可能要便宜得多。再次感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-26
    • 2023-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多