Как сделать запрос, используя GremlinPipeline и PipeFunctions в Java? - PullRequest
3 голосов
/ 30 января 2012

В графовой модели у меня есть вершина с именем timeCategory с дочерними элементами year-vertices, month-vertices и day-vertices. Я могу идентифицировать год с edge-label с IS_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, свойства года которых находятся в заданном диапазоне.

Мой второй вопрос касается пересечения значений в каналах.

Например: у меня есть три трубы: годовая, месячная и дневная, а также трубы, соединяющие вершины, которые обозначают год, месяц или день.

Можно ли получить все исходящие вершины к одной особой дате ...

Полукод: allVertices2012-01-01 = yearpipe.out () И monthpipe.out () И daypipe.out

конечно, я могу сделать некоторые сравнения в некоторых циклах for-each-each, но я хотел знать, есть ли (простой) gremlin - способ сделать это лучше.

Ответы [ 2 ]

2 голосов
/ 31 января 2012

Есть два решения вашей проблемы. Вот оно в Гремлин-Гровах:

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);
0 голосов
/ 03 февраля 2012

Хорошо, прочитав несколько коротких уроков, я понял, что параметр .back (x) должен быть 2 ... так что с .back (2) вы получите свои вершины.Кстати.На мой взгляд, примеры, представленные на http://markorodriguez.com, намного лучше для быстрого старта, чем на github-wiki.пользователи, которые довольно хорошо описывают мою проблему:

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

...