我们可以在 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]
我有一个关于在 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]