比较Gremlin Groovy中的顶点属性

时间:2016-03-16 19:23:44

标签: groovy gremlin tinkerpop

我问你看here几乎相同的问题,但是必须使用groovy而不是java语法的约束。理想情况下,答案非常简洁。

我有一个人顶点的简单图表。每个人都有一个"年龄"列出该人年龄的财产。还有" worksFor"标记的边连接成对的顶点。我希望看到边缘两端的人都有相同年龄属性的所有边缘。

我喜欢类似的查询,其中两个年龄相差不到3年。

如前所述,这应该是groovy,而不是Java语法。 Gremlin 3是首选,但Gremlin 2的答案是可以接受的。

3 个答案:

答案 0 :(得分:7)

  

边缘两端的人具有相同年龄属性的所有边

g.V().as("a").outE("worksFor").as("e").inV().as("b").select("a","b").by("age").
      where("a", eq("b")).select("e")
  

两个年龄相差不到3年

g.V().as("a").outE("worksFor").as("e").inV().as("b").select("a","b").by("age").
      filter {Math.abs(it.get().get("a") - it.get().get("b")) < 3}.select("e")

答案 1 :(得分:1)

如果我们知道与所有其他顶点进行比较的目标顶点,则以下内容可能有效:

t = g.V()。有(&#39; id&#39;,&#39; target_node_id&#39;)。值(&#39;年龄&#39;)。next()

g.V()。有(&#39;年龄&#39;)。过滤{it.get()。值(&#39;年龄&#39;) - t&lt; = 3&amp;&amp; it.get()值(&#39;年龄&#39;) - T&GT; = - 3}

我不知道如何在一个查询中执行此操作。我也不知道是否有功能/步骤来获得绝对值。

这只能部分满足您的需求,但可能只是一个开始。

答案 2 :(得分:0)

使用math步骤比较两个日期属性:

g.V().hasLabel('EnterExitDate').limit(10000).as('enter','exit')
    .where("enter",lt("exit")).by('enter').by('exit')
    .where(math('(exit - enter) / (3600*1000) ')
        .by(values('exit').map({ it.get().time }))
        .by(values('enter').map({ it.get().time }))
        .is(lt(1)))
    .valueMap()

此查询将查找在1小时内发生的所有员工进入退出记录。

EnterExitDate类:

public class EnterExitDate {
    private Date enter;
    private Date exit;
    // getters and setters...
}