很难通过一个好的查询来获得我想要的结果。
在这种情况下,我有报告,商店和组织。
报表只能属于一个商店或一个组织。永远不要都。 商店始终属于一个组织,并且只能属于一个组织。 组织只能是一个组织的子组织,但可以是多个子组织的链。
我正在寻找一个查询,该查询将带一个报告ID,并为我提供一个顶级组织,而不论子组织有多少级。
场景:
当前的边名称只是标签名称reportStore
和storeReport
,reportOrg
和orgReport
,storeOrg
和orgStore
, suborgOrg
和orgSuborg
到目前为止,我得到的最远的是g.V('<id>').until(has('label','org')).repeat(out()).limit(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