我们可以在边沿中放置边沿吗?

时间:2018-09-19 08:01:23

标签: azure-cosmosdb gremlin tinkerpop3

我对gremlin边缘的放置和状态有要求。 我们是否具有像for或condition那样的机制。 g.V()。haslabel('u')。outE('label1','label2')。inV()。has('name','name1')

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

2 个答案:

答案 0 :(得分:1)

始终最好提供一个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”和“ v *”顶点之间的“ label1”和“ label2”的边缘将为零或一个。

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

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()之后,包含Map作为键和值的边数的结果otherV()将展开到条目并在第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]

答案 1 :(得分:0)

相同的has()条件有效

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