当前位置: 首页 > 知识库问答 >
问题:

如何使用gremlin QL递归获取所有子顶点及其边(两者的属性)?

薛承基
2023-03-14

我发现下面的查询非常适合获取给定单个顶点的所有子顶点和边及其属性

g.V().has("name","gremlin").outE().as('e').inV().as('v').select('e','v').by(valueMap())

然而,我如何递归地执行上述操作,即对于给定的顶文,它将遍历其所有子级并返回每个(顶点)及其传出边(s)及其所有属性(顶点和边)......即类似于上面的内容,但在循环中为它找到的每个子顶点......有没有办法使用gremlin做到这一点?

共有1个答案

汲灿
2023-03-14

Gremlin有一个repeat()步骤,您可以完全使用它。你可以重复……直到……重复……多次。文档中有很好的示例。位于此处:https://tinkerpop.apache.org/docs/current/reference/#repeat-步骤

例如

g.V().has("name","gremlin").
      repeat(outE().inV()).times(2).
      path().
        by(valueMap())

请注意,使用valueMap返回所有属性有点像在SQL中执行选择操作,通常,如果结果集很大,最好只返回真正需要的内容。

如果您想返回一棵树而不是一组path结果,您可以使用tree步骤。下面是一个使用TinkerGraph和简单二叉树图的示例。

graph=TinkerGraph.open()
g=graph.traversal()

g.addV('root').property('data',9).as('root').
  addV('node').property('data',5).as('b').
  addV('node').property('data',2).as('c').
  addV('node').property('data',11).as('d').
  addV('node').property('data',15).as('e').
  addV('node').property('data',10).as('f').
  addV('node').property('data',1).as('g').
  addV('node').property('data',8).as('h').
  addV('node').property('data',22).as('i').
  addV('node').property('data',16).as('j').
  addV('node').property('data',7).as('k').
  addV('node').property('data',51).as('l').  
  addV('node').property('data',13).as('m'). 
  addV('node').property('data',4).as('n'). 
  addE('left').from('root').to('b').
  addE('left').from('b').to('c').
  addE('right').from('root').to('d').
  addE('right').from('d').to('e').
  addE('right').from('e').to('i').
  addE('left').from('i').to('j').
  addE('left').from('d').to('f').
  addE('right').from('b').to('h').
  addE('left').from('h').to('k').
  addE('right').from('i').to('l').
  addE('left').from('e').to('m').
  addE('right').from('c').to('n').
  addE('left').from('c').to('g').iterate()

gremlin> g.V().hasLabel('root').repeat(outE().inV()).times(2).tree()

==>[v[0]:[e[28][0-left->2]:[v[2]:[e[35][2-right->14]:[v[14]:[]],e[29][2-left->4]:[v[4]:[]]]],e[30][0-right->6]:[v[6]:[e[3
4][6-left->10]:[v[10]:[]],e[31][6-right->8]:[v[8]:[]]]]]]

gremlin> g.V().hasLabel('root').repeat(outE().inV()).times(2).
               tree().by(valueMap())

==>[[data:[9]]:[[]:[[data:[5]]:[[]:[[data:[8]]:[],[data:[2]]:[]]],[data:[11]]:[[]:[[data:[15]]:[],[data:[10]]:[]]]]]]

gremlin> g.V().hasLabel('root').repeat(outE().inV()).times(2).
               tree().by(valueMap().with(WithOptions.tokens))

    ==>[[id:0,label:root,data:[9]]:[[id:28,label:left]:[[id:2,label:node,data:[5]]:[[id:35,label:right]:[[id:14,label:node,da
    ta:[8]]:[]],[id:29,label:left]:[[id:4,label:node,data:[2]]:[]]]],[id:30,label:right]:[[id:6,label:node,data:[11]]:[[id:34
    ,label:left]:[[id:10,label:node,data:[10]]:[]],[id:31,label:right]:[[id:8,label:node,data:[15]]:[]]]]]]
 类似资料:
  • 但是响应只返回用户和他们的一些属性,而不是我在门户中看到的所有属性。 进行REST调用以获取所有用户及其字段/属性的正确URI是什么?

  • 问题内容: 考虑数据库中的以下行: 每个具有的 是“所有者” /“超级父代”。 从表现的角度来看,收集父母和子女的最佳方法是什么?我应该使用 LINQ 还是 存储过程 ? 我希望最终结果是。 问题答案: 在SQL中,您可以使用CTE进行查询。例如,要检索在其树中具有其父级和最高父级的节点的列表: 这给出了: 请注意,我更改了示例数据,因此第2行不再是其自身的子级,而是第1行的子级。

  • 所以我和蛇怪打过交道。我知道如何使用返回字符串和对象的hashmap。为了演示,我有一个包含值的yaml文件: 当我使用

  • 这里有一个非常简单的查询: 它的JSON输出是 现在,客户顶点还包含属性名称和年龄。我想了解的是,如何(简单地说,如果可能的话)形成我的小精灵查询,使其在图中嵌套顶点属性。注意,当我刚刚运行g.V(“customerId”)时,响应确实包含这些属性。

  • 问题内容: 我正在尝试获取目录及其子目录中所有文件的列表。我当前的递归方法如下: 但是,我希望有一种非递归的方式(可能是现有的API调用)来执行此操作。如果不是,这是最干净的方法吗? 问题答案: 您始终可以使用堆栈(对于DFS)或队列(对于BFS)将迭代解决方案替换为迭代解决方案:

  • 问题内容: 我有一张桌子 我填写这个表 选择idFolder = 1的文件夹时,应返回该文件夹和子子文件夹的所有子文件夹(2,3,4,5,6,7) 当我选择文件夹ID = 4 ==>(5,7,6) 当我选择文件夹ID = 3 ==>(4,5,6,7) 一个查询该怎么做? 谢谢 问题答案: 这是工作中的一个 在此处查看SQL固件:http://sqlfiddle.com/#!2 / 02b78 /