Гремлинский запрос с перекрытием даты и времени - PullRequest
0 голосов
/ 05 февраля 2019

У меня есть следующая графовая база данных. Ссылка на графическое изображение

Вот скрипт для загрузки данных

//Use case for datetimes working at the same company
//only for tinkerpop
graph=TinkerGraph.open()
g=graph.traversal()
//from here on common between neptune and tinkerpop

//Setup started
//create vertexes

//create a company Coca Cola
g.addV('company').property(id,'c1')
g.V('c1').property('name','Coca Cola')
g.V('c1').property('questId','10')

//create a person Alice
g.addV('person').property(id,'p1')
g.V('p1').property('questId','1')
g.V('p1').property('name','Alice')


//create a person Bob
g.addV('person').property(id,'p2')
g.V('p2').property('questId','2')
g.V('p2').property('name','Bob')


//create a person Chris
g.addV('person').property(id,'p3')
g.V('p3').property('questId','3')
g.V('p3').property('name','Chris')


//create a person David
g.addV('person').property(id,'p4')
g.V('p4').property('questId','4')
g.V('p4').property('name','David')

//create a person Emma
g.addV('person').property(id,'p5')
g.V('p5').property('questId','5')
g.V('p5').property('name','Emma')

//create edges
//Coca Cola employes Alice
g.addE('employeed').from(g.V('c1')).to(g.V('p1')).property(id,'c1p1')
g.E('c1p1').property('fromDate','2009-01-10').next()
g.E('c1p1').property('toDate','2018-12-13').next()

//create edges
//Coca Cola employes Bob
g.addE('employeed').from(g.V('c1')).to(g.V('p2')).property(id,'c1p2')
g.E('c1p2').property('fromDate','2015-11-13').next()

//create edges
//Coca Cola employes Chris
g.addE('employeed').from(g.V('c1')).to(g.V('p3')).property(id,'c1p3')
g.E('c1p3').property('fromDate','2017-01-10').next()
g.E('c1p3').property('toDate','2019-01-10').next()

//create edges
//Coca Cola employes Chris
g.addE('employeed').from(g.V('c1')).to(g.V('p4')).property(id,'c1p4')
g.E('c1p4').property('fromDate','2008-01-10').next()
g.E('c1p4').property('toDate','2016-01-10').next()

//create edges
//Coca Cola employes Emma
g.addE('employeed').from(g.V('c1')).to(g.V('p5')).property(id,'c1p5')
g.E('c1p5').property('fromDate','2016-01-01').next()

Интересно, где можно выполнить следующие запросы?

  1. Нам нужно знать, к кому обратиться за рекомендацией для Алисы.
  2. Ссылку может дать только кто-то, кто работал с Алисой в той же компании в течение определенного промежутка времени.
  3. Их последняя совместная работа должна была произойти максимальное количество времени назад с сегодняшнего дня
  4. Время наложения является входным значением в запросе.
  5. Количество времениназад от сегодняшнего дня есть входные данные для запроса.

Результаты должны быть

Количество времени перекрытия Количество времени назад (С сегодняшнего дня) Результат 3 года перекрытия --- 2Годы совместной работы - Боб - Сотрудники - Coca Cola

Единственное, что мне удалось придумать, - это следующий запрос, который далек от требований.

//People who worked between dates with Alice
g.V().hasLabel('person').
       repeat(bothE().has('fromDate',between('2009-01-01','2020-12-31')).otherV().simplePath()).
       until(has('name','Alice')).
       path().
       by('name').
       by(label)

  [1]: https://i.stack.imgur.com/hbKUV.jpg

Ответы [ 3 ]

0 голосов
/ 19 февраля 2019

Вот улучшенная версия приема данных с использованием дней с эпохи.Скрипт для загрузки данных, но, похоже, не работает.

        //Use case for datetimes working at the same company
    //only for tinkerpop
    graph=TinkerGraph.open()
    g=graph.traversal()
    //from here on common between neptune and tinkerpop//Setup started
    //create vertexes//create a company Coca Cola
    g.addV('company').property(id,'c1')
    g.V('c1').property('name','Coca Cola')
    g.V('c1').property('questId','10')//create a person Alice
    g.addV('person').property(id,'p1')
    g.V('p1').property('questId','1')
    g.V('p1').property('name','Alice')
    //create a person Bob
    g.addV('person').property(id,'p2')
    g.V('p2').property('questId','2')
    g.V('p2').property('name','Bob')
    //create a person Chris
    g.addV('person').property(id,'p3')
    g.V('p3').property('questId','3')
    g.V('p3').property('name','Chris')
    //create a person David
    g.addV('person').property(id,'p4')
    g.V('p4').property('questId','4')
    g.V('p4').property('name','David')//create a person Emma
    g.addV('person').property(id,'p5')
    g.V('p5').property('questId','5')
    g.V('p5').property('name','Emma')//create edges
    //Coca Cola employes Alice
    g.addE('employeed').from(g.V('c1')).to(g.V('p1')).property(id,'c1p1')
    g.E('c1p1').property('fromDate',14253).next()
    g.E('c1p1').property('toDate',17877).next()//create edges
    //Coca Cola employes Bob
    g.addE('employeed').from(g.V('c1')).to(g.V('p2')).property(id,'c1p2')
    g.E('c1p2').property('fromDate',16751).next()//create edges
    //Coca Cola employes Chris
    g.addE('employeed').from(g.V('c1')).to(g.V('p3')).property(id,'c1p3')
    g.E('c1p3').property('fromDate',17175).next()
    g.E('c1p3').property('toDate',17905).next()//create edges
    //Coca Cola employes Chris
    g.addE('employeed').from(g.V('c1')).to(g.V('p4')).property(id,'c1p4')
    g.E('c1p4').property('fromDate',13887).next()
    g.E('c1p4').property('toDate',16809).next()//create edges
    //Coca Cola employes Emma
    g.addE('employeed').from(g.V('c1')).to(g.V('p5')).property(id,'c1p5')
    g.E('c1p5').property('fromDate',16809).next()

Здесь приведен запрос, чтобы заставить людей работать в течение последних двух лет с перекрытием в 1 год.Я должен получить только Боб.

//Neptune
g.V().has('person','name','Alice').
  inE('employeed').as('e1').outV().
  outE('employeed').where(neq('e1')).as('e2').inV().
  project('colleague','start','end').
    by('name').
    by(union(select('e1','e2').select(values).unfold().values('fromDate'),
             constant(16877)).max()).
    by(union(coalesce(select('e1').values('toDate'), constant(17972)),
             coalesce(select('e2').values('toDate'), constant(17972))).min()).
  filter(math('end-start').is(gte(365))).
  select('colleague')
0 голосов
/ 21 февраля 2019

Вот последние запросы для достижения моих вариантов использования.

Первый вариант использования.Время перекрытия 3 ЛЕТ
Количество времени назад (с сегодняшнего дня) 2 ЛЕТ Результат Боб - Работник - Coca Cola

Запрос

g.V().has('person','name','Alice').
  inE('employeed').as('e1').outV().
  outE('employeed').
  where(neq('e1')).as('e2').
  and(values('fromDate').is(lt(17948))).
  and(values('toDate').is(gt(17215))).
  inV().
  project('colleague','start','end').
        by('name').
        by(union(select('e2').values('fromDate'),select('e1').values('fromDate')).max()).
        by(union(select('e2').values('toDate'),select('e1').values('toDate')).min()).
  filter(math('end-start').is(gte(1095))).
  select('colleague','start','end')

Результат

==> [коллега Боб, начать: 16751, конец: 17877]

0 голосов
/ 05 февраля 2019

С датами в виде целых чисел вы можете сделать что-то вроде этого:

today = LocalDate.now()
start = today.minusYears(3)
minOverlap = 365 * 2 // 2 years

g.V().has('person','name','Alice').
  inE('employeed').as('e1').outV().
  outE('employeed').where(neq('e1')).as('e2').inV().
  project('colleague','start','end').
    by('name').
    by(union(select('e1','e2').select(values).unfold().values('fromDate'),
             constant(start.toEpochDay())).max()).
    by(union(coalesce(select('e1').values('toDate'), constant(today.toEpochDay())),
             coalesce(select('e2').values('toDate'), constant(today.toEpochDay()))).min()).
  filter(math('end-start').is(gte(minOverlap))).
  select('colleague')

Это вернет Bob и Emma;оба они работали с Alice около 3 лет.

...