【问题标题】:Traversing a subset of Graph for complex queries遍历 Graph 的子集以进行复杂查询
【发布时间】:2020-09-18 13:18:09
【问题描述】:

我对 Gremlin 还很陌生,我正在努力提高查询效率。

使用看起来像这样的图表:

[vertex: label=a] -> [vertex: label=b] -> [vertex: label=c] -> [vertex: label=d]

我需要遍历图,并得到遍历每一步的结果。

例如,从我的基础顶点中,我可能需要使用标签“b”获取与其相关的所有内容使用标签“c”获取与“b”相关的所有内容等等。

我可以像这样单独处理请求:

results1 = g.V('someid').out().hasLabel('b').toList()
results2 = g.V('someid').out().hasLabel('b').out().hasLabel('c').toList()
results3 = g.V('someid').out().hasLabel('b').out().hasLabel('c').out().hasLabel('d').toList()

但这似乎违反直觉,并且响应时间开始增加。

我不太确定我在寻找什么,但也许会以某种方式继续搜索图的子集,而不是每次都从基本顶点开始。

编辑:

我找到了 Union 步骤,但这似乎将多个小查询合并为一个大查询,我相信最终会导致与单独执行所有查询相同的低效率。

【问题讨论】:

  • 努力确保我完全理解您的问题。您是否正在寻找一种从您以前找到的地方开始未来遍历的方法?如果是这样,您可以将 ID 列表作为一个选项传递给 V() 步骤。
  • 对不起,如果我不是很清楚。开始查询时,我有一个 ID,我将其传递给 V()。然后我需要递归地获取该顶点的关系。所以我需要 V()->A 和 V()->A->B 和 V()->A->B->C 等

标签: gremlin graph-databases amazon-neptune


【解决方案1】:

在 Gremlin 中取回查询所在位置的 path 非常简单。下面是一个简单的示例,它使用了对航线进行建模的数据集:

g.V('3').  
  repeat(out().hasLabel('airport').simplePath()).
  until(has('code','AGR')).
  limit(5).
  path().
    by('code')

==>[AUS,JFK,BOM,AGR]
==>[AUS,YYZ,BOM,AGR]
==>[AUS,LHR,BOM,AGR]
==>[AUS,FRA,BOM,AGR]
==>[AUS,EWR,BOM,AGR] 

您将在此处找到一些相关示例: http://www.kelvinlawrence.net/book/PracticalGremlin.html http://www.kelvinlawrence.net/book/PracticalGremlin.pdf

【讨论】:

  • 感谢 Kelvin,path 正是我想要的。我现在只需要做一些工作来对结果进行分组。顺便说一句,在你回答我的问题之前,我已经用你的书拿起了 Gremlin!这是一个很好的资源,我想我不是一个优秀的读者,因为我错过了这一点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-11-06
  • 1970-01-01
  • 1970-01-01
  • 2012-12-27
  • 2023-03-22
  • 2021-09-12
  • 1970-01-01
相关资源
最近更新 更多