【问题标题】:Can we put and condition in edges in gremlin我们可以在 gremlin 的边缘放置和条件吗
【发布时间】:2018-09-19 08:01:22
【问题描述】:

我对 gremlin 中边缘的放置和条件有要求。 我们是否有类似 for 或 condition 的机制。 g.V().haslabel('u').outE('label1','label2').inV().has('name','name1')

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

【问题讨论】:

  • 你是说你想找到每个类型至少有一个边的“u”顶点:“label1”和“label2”,并且这两个边都以相邻顶点结束属性 "name"="name1"?
  • 不,我想使用我指定的标签进行遍历。从 u 开始,给我所有带有边的顶点,它们之间有两个标签 label1 和 label2 。所以在顶点 u 和 name1 之间有两条边,分别有 label1 和 label2。
  • 好的 - 我想我们说的是同一件事。

标签: azure-cosmosdb gremlin tinkerpop3


【解决方案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]

【讨论】:

    【解决方案2】:

    相同的 has() 条件起作用

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

    【讨论】:

    • 您是否想说我们必须将has 链接起来才能使edge 中的'AND' 起作用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-06
    • 2012-06-03
    • 2014-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多