如何在Java中使用GremlinPipeline和PipeFunctions进行查询?

时间:2012-01-30 18:16:46

标签: date filter neo4j graph-databases gremlin

在图表模型中,我有一个名为timeCategory的顶点,其子项为year-verticesmonth-verticesday-vertices。我能够确定edge-labelIS_YEAR,一个月IS_MONTH等的一年。

我想做一个返回给定年份范围的所有顶点的查询,类似于以下代码:

GremlinPipeline yearPipe = new GremlinPipeline(timeCategory).out("IS_YEAR").property("year")
            .filter(new PipeFunction<Integer, Boolean>() {
                      public Boolean compute(Integer i)
                      {
                        return i < 2013 && i >= 2011;
                      }
                    });
for(Object v : yearPipe) {
  //v is an Integer, but i need the vertex
  System.out.println(v);
}

...这适用于打印所有属性值(年份为整数),但我需要的是所有VERTICES的列表,其中年属性在给定范围之间。

我的第二个问题是关于从管道中的值进行交叉。

例如:我有三个管道,一个管道,一个月管和日期管道,以及包含标识一年,一月或一天的顶点的管道。

是否可以将所有传出顶点都放到一个特殊日期......

Semi-Code:allVertices2012-01-01 = yearpipe.out()AND monthpipe.out()AND daypipe.out

当然,我可以在一些for-each-loops中做一些比较,但我想知道是否有一种(简单的)gremlin方式来做得更好。

2 个答案:

答案 0 :(得分:2)

您的问题有两种解决方案。这是在Gremlin-Groovy:

timeCategory.out('IS_YEAR').filter{year = it.getProperty('year'); year < 2013 && year >= 2011} 

-OR -

timeCategory.out('IS_YEAR').property('year').filter{it < 2013 && it >= 2011}.back(1)

以下是您在Gremlin-Java代码中的答案(上面的第二个表示):

GremlinPipeline yearPipe = new GremlinPipeline(timeCategory).out("IS_YEAR").property("year")
        .filter(new PipeFunction<Integer, Boolean>() {
            public Boolean compute(Integer i)
            {
                if(i<2013 && i>=2011)
                    return true;
                else
                    return false;
            }

        }).back(1);

答案 1 :(得分:0)

好了一些简短的教程阅读之后,我发现.back(x)上的参数应该是2 ...所以,使用.back(2)你将得到你的顶点。 顺便说一句。在http://markorodriguez.com提供的示例对于gremlin快速启动来说要好得多,然而在我看来这些在github-wiki上。

对于我的第二个问题:我发现有一个关于gremling-users的话题,很好地描述了我的问题:

http://groups.google.com/group/gremlin-users/browse_thread/thread/d245b1a25ac1fac8/514931b1e3bf9e30?lnk=gst&q=intersect#514931b1e3bf9e30