比较 Gremlin Groovy 中的顶点属性

问题描述 投票:0回答:3

我问的问题几乎与您在here看到的问题相同,但有一个限制,即必须使用groovy语法,而不是java语法。理想情况下,答案会非常简洁。

我有一个简单的人物顶点图。每个人都有一个“年龄”属性,列出该人的年龄(以岁为单位)。还有连接成对人物顶点的“worksFor”标记边。我想查看边缘两端的人具有相同年龄属性的所有边缘。

然后我想要一个类似的查询,其中两个年龄相差不到 3 年。

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

groovy gremlin tinkerpop
3个回答
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
投票

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

t=g.V().has('id', 'target_node_id').values('age').next()

g.V().has('age').filter{it.get().value('age')-t<=3 && it.get().value('age')-t>=-3}

我不知道如何在一个查询中做到这一点。我也不知道是否有一个函数/步骤可以获取绝对值。

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


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...
}
© www.soinside.com 2019 - 2024. All rights reserved.