我对gremlin边缘的放置和状态有要求。 我们是否具有像for或condition那样的机制。 g.V()。haslabel('u')。outE('label1','label2')。inV()。has('name','name1')
我已经检查过where子句,但是它进一步限制了遍历。我们是否有更灵活的机制来延续链条?
答案 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'的边。