写一篇",;“外连接”;在Gremlin中查询AWS Neptune(不使用lambda步骤)

写一篇",;“外连接”;在Gremlin中查询AWS Neptune(不使用lambda步骤),gremlin,amazon-neptune,Gremlin,Amazon Neptune,我想根据以下条件返回用户的不同git分支: 不要返回主分支 返回没有关联拉请求的分支 当没有任何拉请求打开或合并时,返回与拉请求关联的分支 因此,考虑到以下样本数据 user = graph.addVertex(label, 'User', 'name', 'John') branch1 = graph.addVertex(label, 'Branch', 'name', 'branch1') branch2 = graph.addVertex(label, 'Branch', 'name'

我想根据以下条件返回用户的不同git分支:

  • 不要返回主分支
  • 返回没有关联拉请求的分支
  • 当没有任何拉请求打开或合并时,返回与拉请求关联的分支
因此,考虑到以下样本数据

user = graph.addVertex(label, 'User', 'name', 'John')
branch1 = graph.addVertex(label, 'Branch', 'name', 'branch1')
branch2 = graph.addVertex(label, 'Branch', 'name', 'branch2')
branch3 = graph.addVertex(label, 'Branch', 'name', 'branch3')
branchmaster = graph.addVertex(label, 'Branch', 'name', 'master')
user.addEdge('AUTHOR_OF', branch1)
user.addEdge('AUTHOR_OF', branch2)
user.addEdge('AUTHOR_OF', branch3)
user.addEdge('AUTHOR_OF', branchmaster)
pr2 = graph.addVertex(label, 'PullRequest', 'name', 'pr2', 'state', 'OPEN')
pr3 = graph.addVertex(label, 'PullRequest', 'name', 'pr3', 'state', 'DECLINED')
branch2.addEdge('SOURCE_OF', pr2)
branch3.addEdge('SOURCE_OF', pr3)
pr22 = graph.addVertex(label, 'PullRequest', 'name', 'pr22', 'state', 'MERGED')
branch2.addEdge('SOURCE_OF', pr22)
pr23 = graph.addVertex(label, 'PullRequest', 'name', 'pr23', 'state', 'DECLINED')
branch2.addEdge('SOURCE_OF', pr23)
我想返回branch1(因为没有关联的PR)和branch3(因为关联的PR被拒绝)

以下查询不适用于AWS Neptune,因为Neptune不支持lambda步骤:

g.V().hasLabel('User')
  .out('AUTHOR_OF')
  .hasLabel('Branch')
  .has('name', neq('master'))
  .where(out('SOURCE_OF')
    .hasLabel('PullRequest').values('state').fold()
    .filter{ !(it.get().contains('OPEN') || it.get().contains('MERGED')) })
  .dedup()
  .order().by('updated_at', desc)

您可以在谓词中使用

g.V().hasLabel('User')
  .out('AUTHOR_OF')
  .hasLabel('Branch')
  .has('name', neq('master'))
  .where(__.not(out('SOURCE_OF').hasLabel('PullRequest').has('state', within(['OPEN','MERGED']))))
  .dedup()
  .order().by('updated_at', desc)

好的答案-也许考虑<代码> P.OutOUTE()/代码>并通过删除<代码>()<代码>来提高可读性,注意,我们还需要返回没有“源代码”的分支,这样,我就得到了两个遍历。另一种选择是使用'or'并进行两次'out'遍历,有'not'和没有'not',这在我看来不太可取。我明白了,这是有道理的。我错过了那个微妙之处