Gremlin 查询以检查顶点上的边对

Gremlin Query to check for pairs of edges on vertices

对于某些上下文:我目前正在使用 azure cosmos db 和 gremlin api,因为存储扩展架构,执行 ' .out()' 操作而不是'.in()' 操作,因此我总是创建双向边,因此我根据要查询的方向选择与'.out()' 操作一起使用的边。

我们使用图表将事件与用户相关联。每当用户 'U' 引发事件 'E' 时,我们都会创建两条边:

g.V('U').addE('raisedEvent').to(g.V('E'))
g.V('E').addE('raisedByUser').to(g.V('U'))

极少数情况下,这些查询中的一个会由于某种原因而失败,最终我们在两个顶点之间只有一条边。我一直在尝试找到一种方法来查询给定一组 'paired' 边标签的所有仅具有单向关系的顶点,以便找到这些错误并重新创建丢失的边。

基本上我需要一个查询...

示例:

// given a graph
g.addV('user').property('id','user_1')
g.addV('user').property('id','user_2')
g.addV('user').property('id','user_3')
g.addV('user').property('id','user_4')
g.addV('event').property('id','event_1')
g.addV('event').property('id','event_2')
g.addV('event').property('id','event_3')
g.addV('event').property('id','event_4')

g.V('user_1').addE('raisedEvent').to(g.V('event_1')).V('event_1').addE('raisedByUser').to(g.V('user1'))
g.V('user_2').addE('raisedEvent').to(g.V('event_2')).V('event_1').addE('raisedByUser').to(g.V('user1'))
g.V('user_2').addE('raisedEvent').to(g.V('event_3'))
g.V('event_4').addE('raisedByUser').to(g.V('user_3'))

// i.e.
//                (user_1) <--> (event_1)
// (event_2) <--> (user_2) ---> (event_3)
// (event_4) ---> (user_3)
//                (user_4)

// Then, the query should match with user_2 and user_3... 
// ...as they contain uni-directional links to events

编辑:注意 - 'is()' 操作的 cosmosdb 实现不支持将遍历结果作为输入

等查询

where(_.outE('raisedEvent').count().is(__.out('raisedEvent').outE('raisedByUser').count()))

目前在 cosmosdb 中不受支持。

如果可能的话,最好能得到一个列表,其中列出哪些顶点对有一个坏的link(例如在这种情况下[(user_2,event_3), (user_3, event_4)]), 但只要知道哪些顶点有问题 link 就已经非常有用了。

多亏了 Kelvin Lawrence,我最终使用这个模式得到了一个顶点 ID 对列表,这些顶点 ID 对只 uni-directionally 从 a 连接到 b:

g.V().haslabel("user").as('a').out('raisedEvent').where(__.not(out('raisedByUser').as('a'))).as('b').select('a','b').by('id')