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



在图模型中,我有一个名为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);
}

这对于打印所有属性值(年份为整数)非常有效,但我需要的是一个在给定范围内的所有年份属性的列表。

我的第二个问题是关于从管道中的值生成交集。

例如:我有三个管道,一个yearpipe、一个monthpipe和daypipe,这些管道包含标识年份、月份或日期的顶点。

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

半代码:allVertices22012-01-01=yearpipe.out()AND monthpipe.out)AND daypipe.out

当然,我可以对每个循环进行一些比较,但我想知道是否有一种(简单的)小精灵方法可以做得更好。

您的问题有两种解决方案。它在Gremlin Groovy中:

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

-或-

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);

好的,在阅读了一些简短的教程后,我得出了.back(x)上的参数应该是2……所以,使用.back(2),您将获得顶点。顺便提一下,在http://markorodriguez.com在我看来,对于gremlin快速启动来说,比githubwiki上的这些要好得多。

对于我的第二个问题:我发现有一个关于小精灵用户的主题,它很好地描述了我的问题:

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

最新更新