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

使用gremlin获取眩晕和边缘

郑和泰
2023-03-14

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

[示例图]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)

共有1个答案

濮君植
2023-03-14

下面的查询将使其成为一个全局列表“r”。我更改了策略,将遍历折叠为一个全局列表“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)
 类似资料:
  • 我需要的是,我将在端口(本地机器)中打开一个服务器监听,并且可以向我发送数据包。我的计算机没有。基本上我需要。 我正在测试服务器/客户端项目。我在服务器(公共ip)中运行stuntman-server。在我的系统中运行客户端(本地ip)。我要求为端口提供映射IP/端口。 Stun服务器返回IP和端口。然后,我在本地系统中打开一个服务器(使用java),并开始侦听端口,并将一个消息从发送到stun服

  • 我只是在玩Cosmos DB中的Graph API,它使用Gremlin语法进行查询。 我在图中有许多用户(顶点),每个用户对其他用户都有“知道”的属性。其中一些是外边缘(outE),另一些是内边缘(inE),具体取决于关系的创建方式。我现在尝试创建一个查询,该查询将返回给定用户(顶点)的所有“已知”关系。我可以通过以下方式轻松获取inE或outE的ID: 其中是我正在查询的用户的ID,但我无法提

  • 我正在azure中使用cosmos图形数据库。 有人知道是否有一种方法可以在两个顶点之间添加一条边,只有当它不存在时(使用gremlin图查询)? 我可以在添加顶点时这样做,但不能使用边。我从这里获取了执行此操作的代码: 谢谢

  • 我有一个图,其中顶点有几个出站边类型,每个边类型都有属性。我想从每个顶点获得出站边的计数,但将计数限制为具有特定标签和属性值的边。 到目前为止,我有: 这给了我一个具有正确标签和属性的每个源vertext和每个传出边的列表。我想做的是将其减少到每个源顶点的单个条目和出站边的数量。但是,我似乎无法让与结合使用。我得到的最接近的是: 这使我可以按源顶点计数,但包括带有该标签的所有边,而不管它们具有什么

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

  • 我试图组合一个查询来获取所有传入和传出的顶点,包括它们的边和方向,但这也会返回那些没有边的顶点。 我现在可以通过强制所有东西都至少有一个边缘来解决这个问题,但这是我想要避免的。 也许值得注意的是,我使用Azure CosmosDB的图形API:https://docs.microsoft.com/en-us/azure/cosmos-db/gremlin-support 这是我用来返回所有顶点及其