我们可以在 gremlin 的边缘放置和调整条件吗

Can we put and condition in edges in gremlin

我有一个关于在 gremlin 中放置和调整边缘的要求。 我们是否有像我们拥有的机制或条件。 g.V().haslabel('u').outE('label1','label2').inV().has('name','name1')

我已经检查了 where 子句,但它进一步限制了遍历。我们是否有更灵活的机制来继续链?

相同的 has() 条件有效

尝试:g.E().has('edgeProperty') => 这将给出所有设置了 'edgeProperty' 的边。

最好提供一个生成一些示例数据的 Gremlin 脚本,因为它可以使问题的上下文更加清晰:

g.addV('u').as('u').
  addV('v').property('name','name1').as('v1').
  addV('v').property('name','name2').as('v2').
  addV('v').property('name','name1').as('v3').
  addE('label1').from('u').to('v1').
  addE('label2').from('u').to('v1').
  addE('label1').from('u').to('v2').
  addE('label2').from('u').to('v2').
  addE('label2').from('u').to('v3').iterate()

在这种情况下,我假设您只想获得上面标记为 "v1" 的顶点,因为它是唯一具有两条边的顶点(一条标记为 "label1",一条标记为 "label2") 并且具有 属性 键 "name1"。我进一步假设你的图的模式只允许边缘的单一多重性,这样你将在 "u" 和 "label1" 和 "label2" 之间有零个或一个边缘"v*" 个顶点。

我采用了这种方法,尽管可能还有其他方法:

gremlin> g.V().hasLabel('u').
......1>   outE('label1','label2').
......2>   where(otherV().has('name','name1')).
......3>   groupCount().
......4>    by(otherV()).
......5>   unfold().
......6>   where(select(values).is(eq(2))).
......7>   select(keys).
......8>   unfold().
......9>   valueMap(true)
==>[id:1,name:[name1],label:v]

这里的要点是考虑 groupCount(),它基本上是给你连接到 otherV() 的边数。您希望这些值等于 2 以便过滤器成功。因此,在 groupCount() 之后,包含键 otherV() 和值的边数的结果 Map 展开到条目并在第 6 行过滤。一旦我们有了它,我们就可以只需从 Map 中获取密钥,因为我们不再需要计数了。

我也尝试了 match(),我认为 CosmosDB 不支持它,但在这种情况下实际上读起来非常好:

gremlin> g.V().hasLabel('u').
......1>   match(__.as('u').out('label1').as('v'),
......2>         __.as('u').out('label2').as('v'),
......3>         __.as('v').has('name','name1')).
......4>   select('v').
......5>     by(valueMap(true))
==>[id:1,name:[name1],label:v]