【问题标题】:get verties and edges using gremlin使用 gremlin 获取顶点和边
【发布时间】:2021-11-24 02:37:23
【问题描述】:

我正在尝试通过遍历特定边的标签来返回从特定顶点开始的顶点和边 我正在寻找的结果是顶点,被遍历的边 + 叶节点的所有边

[示例图] https://i.stack.imgur.com/5yQTW.png

预期结果:
ap1 包含 p1
ap2 包含 p1
p1 使用
f1 包含 ap1
f2 包含 f1
f3 包含 f2
f3 用途
f4 包含 ap2
f5 包含 f4
f6 包含 f5
f6 使用

生成图表的脚本

g.addV('project').property('name','p1').as('p1').addV('api').property('name','ap1').as('ap1').addV('api').property('name','ap2').as('ap2').addV('field').property('name','f1').as('f1').addV('field').property('name','f2').as('f2').addV('field').property('name','f3').as('f3').addV('field').property('name','f4').as('f4').addV('field').property('name','f5').as('f5')  addV('field').property('name','f6').as('f6').addV('table').property('name','t1').as('t1').addV('column').property('name','c1').as('c1').addV('schema').property('name','s1').as('s1').addE('contained').from('f3').to('f2').addE('contained').from('f2').to('f1').addE('contained').from('f1').to('ap1').addE('contained').from('ap1').to('p1').addE('contained').from('f6').to('f5').addE('contained').from('f5').to('f4').addE('contained').from('f4').to('ap2').addE('contained').from('ap2').to('p1').addE('uses').from('f3').to('t1').addE('uses').from('f6').to('c1').addE('uses').from('p1').to('s1')

似乎我遇到了循环问题(orientdb 堆栈溢出) 使用以下查询时:

g.V().
  has("name", "p1").
  repeat(
    bothE().
    or(hasLabel("contained"), hasLabel("uses")).
    dedup().
    bothV().
    bothE()).
    times(1).
    emit().
  path().
  unfold().
  dedup().
  aggregate('r').
  sideEffect(cap('r').unfold().hasLabel("api").aggregate('c0')).
  sideEffect(
    cap('c0').
    unfold().
    repeat(inE("contained").dedup().outV()).
      until(inE("contained").count().is(0)).
      emit().
    path().
    unfold().
    dedup().
    aggregate('c0')).
  cap('c0').
  unfold().
  aggregate('r').
  cap('r').
  unfold().
  dedup().
  limit(1000)

【问题讨论】:

  • 您能否使用构建示例图的 addV 和 addE 步骤添加 gremlin 查询?
  • 我正要对示例图发表同样的评论。虽然图片很有用,但如果提供了示例图表,它可以帮助人们为您提供经过测试的答案。如果您需要一些 addVaddE 步骤用于创建小图的示例,请参阅此问题的答案stackoverflow.com/questions/68930863/…
  • @HadoopMarc 当然。已添加

标签: gremlin orientdb


【解决方案1】:

下面的查询会成功
我更改了将遍历折叠到全局列表“r”的策略。
然后将中间计算 (c0,c1) 连接到列表 'r'

g.V().
  has("name", "p1").emit().
  repeat(
    bothE().or(hasLabel("contained"), hasLabel("uses")).dedup().otherV()).
    times(1).
    as('v').
  aggregate('c0').
    by(select(all, 'v').unfold().union(identity(), bothE()).fold()).
  aggregate('c1').
    by(
      select(all, 'v').
      unfold().
      hasLabel("api").
      repeat(inE("contained").dedup().outV()).
        until(inE("contained").count().is(0)).
        emit().
      union(identity(), bothE()).
      fold()).
  fold().
  store('r').by(cap('c0')).
  store('r').by(cap('c1')).
  cap('r').
  unfold().
  unfold().
  unfold().
  dedup().
  limit(1000)

【讨论】:

    猜你喜欢
    • 2018-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-20
    • 2017-10-24
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多