从多个路径获取单个gremlin结果

时间:2019-01-28 21:23:42

标签: azure-cosmosdb gremlin

很难通过一个好的查询来获得我想要的结果。

在这种情况下,我有报告,商店和组织。

报表只能属于一个商店或一个组织。永远不要都。 商店始终属于一个组织,并且只能属于一个组织。 组织只能是一个组织的子组织,但可以是多个子组织的链。

我正在寻找一个查询,该查询将带一个报告ID,并为我提供一个顶级组织,而不论子组织有多少级。

场景:

  1. 报告>商店>组织
  2. 报告>商店> org> org> org
  3. 报告>组织
  4. 报告>组织>组织>组织

当前的边名称只是标签名称reportStorestoreReportreportOrgorgReportstoreOrgorgStoresuborgOrgorgSuborg

到目前为止,我得到的最远的是g.V('<id>').until(has('label','org')).repeat(out()).limit(1)

但很明显,这不是直接拍摄,一旦到达第一个组织,它将立即停止。

1 个答案:

答案 0 :(得分:1)

在询问有关Gremlin的问题时,总是最好包括一个可以创建一些示例数据的Gremlin脚本-像这样:

g.addV('report').property('name','report-a').as('a').
  addV('report').property('name','report-b').as('b').
  addV('store').property('name','store').as('s').
  addV('org').property('name','org-z').as('z').
  addV('org').property('name','org-y').as('y').
  addV('org').property('name','org-x').as('x').
  addV('org').property('name','org-w').as('w').
  addE('link').from('a').to('s').
  addE('link').from('s').to('z').
  addE('link').from('z').to('y').
  addE('link').from('y').to('x').
  addE('link').from('b').to('w').iterate()

在上面的数据中,我收集了要返回“ org-x”的“ report-a”和要返回“ org-w”的“ report-b”(即从a树中的叶子遍历到最高顶点)。您的边缘标签似乎与查询没有任何关系,因此为了简单起见,我从示例中省略了它们。

使用repeat()是正确的,但是正如您提到的使用until()可能过早地杀死循环。在这种情况下,给定您拥有的数据结构,您可以允许循环自行终止-当循环到达最后一个“组织”时,它将简单地停止迭代。重要的部分是emit()的最后一个顶点,您可以通过查找没有传出边的顶点来检测该顶点,在Gremlin中是:__.not(outE())。因此,您的工作查询是:

gremlin> g.V().has('report','name','report-a').
......1>   repeat(out()).
......2>     emit(__.not(outE())).
......3>   values('name')
==>org-x
gremlin> g.V().has('report','name','report-b').
......1>   repeat(out()).
......2>     emit(__.not(outE())).
......3>   values('name')
==>org-w