Gremlin запрос, как сравнить свойства ребер в одной и той же ветке моего обхода? - PullRequest
0 голосов
/ 07 января 2019

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

Вот пример - допустим, у меня есть следующая иерархия, состоящая из Schools, Teams и Athletes, любая из которых может быть подключена к Uniform через край wears. И скажем также, что я записываю дату создания каждого ребра в виде свойства этого ребра с именем created. В любой возможной ветке, такой как выделенная синим, мне нужно запросить maximum(wears.created, establishes.created, recruits.created) >= 2009.

enter image description here

Как я могу показать каждую форму, которую спортсмен носил с 2009 года, вместе с датой, когда они начали ее носить?

Иногда этой датой является год, когда Спортсмен был завербован в Команду, иногда это год, когда Школа создала Команду, а иногда - каждый раз, когда отдельный Спортсмен, Команда или Школа начинали носить новую форму.

Мне нужен способ выбрать максимальную дату создания всех ребер в ветви (как показано синим цветом выше), а затем также сравнить этот максимум с предоставленной датой 2009 года.

Нечто подобное может быть? Возможно ли что-нибудь подобное в гремлине ??

g.V().hasLabel("Athlete").as("athlete").union(
    __.outE("wears").has("created", P.gte(2009)).as("when").by("created"),
    __.inE("recruits").as("r").by("created").outV().hasLabel("Team")
        .outE("wears").as("w").by("created")
        .select(max("r", "w")).as("when")
        .where("when", P.gte(2009))
    __.inE("recruits").as("r").by("created").outV().hasLabel("Team")
        .inE("establishes").as("e").by("created").outV().hasLabel("School")
        .outE("wears").as("w").by("created")
        .select(max("r", "e", "w")).as("when")
        .where("when", P.gte(2009))
).inV().hasLabel("Uniform").as("uniform")
.select("athlete", "uniform", "when")

<== Редактировать ================================================ ======>

Добавление сценария запуска для помощи в тестировании согласно комментарию Стивена Маллета.

g.addV('School').property('id',1).property("name", "Duke").as('duke').
  addV('School').property('id',2).property("name", "UNC").as('unc').
  addV('Team').property('id',3).property("name", "Soccer").as('soccer').
  addV('Team').property('id',4).property("name", "Football").as('football').
  addV('Team').property('id',5).property("name", "Basketball").as('basketball').
  addV('Athlete').property('id',6).property("name", "Joe").as('joe').
  addV('Athlete').property('id',7).property("name", "Jane").as('jane').
  addV('Athlete').property('id',8).property("name", "Alice").as('alice').
  addV('Athlete').property('id',9).property("name", "Bob").as('bob').
  addV('Uniform').property('id',10).property("color", "red").as('red').
  addV('Uniform').property('id',11).property("color", "pink").as('pink').
  addV('Uniform').property('id',12).property("color", "blue").as('blue').
  addV('Uniform').property('id',13).property("color", "teal").as('teal').
  addV('Uniform').property('id',14).property("color", "green").as('green').
  addE('contains').property("created", 2009).from('duke').to('soccer').
  addE('contains').property("created", 1960).from('unc').to('football').
  addE('contains').property("created", 2007).from('duke').to('basketball').
  addE('contains').property("created", 2016).from('soccer').to('bob').
  addE('contains').property("created", 2008).from('basketball').to('jane').
  addE('contains').property("created", 2010).from('basketball').to('alice').
  addE('contains').property("created", 2015).from('football').to('joe').
  addE('wears').property("created", 2009).from('duke').to('blue').
  addE('wears').property("created", 1999).from('unc').to('red').
  addE('wears').property("created", 2010).from('soccer').to('teal').
  addE('wears').property("created", 2009).from('football').to('pink').
  addE('wears').property("created", 2009).from('basketball').to('teal').
  addE('wears').property("created", 2012).from('alice').to('green')

С ожидаемым результатом, следующим (Добавление результата согласно предложению Даниэля Куппица). Чтобы объяснить первую строку результата: Джейн носит чирок с 2009 года, потому что баскетбольная команда, созданная в 2007 году при герцоге, Джейн присоединилась к команде в 2008 году, но баскетбольная команда начала носить чирок в 2009 году, поэтому 2009 год является максимальной датой для Джейн и эта униформа.

Jane wears teal since 2009
Jane wears blue since 2009
Alice wears teal since 2010
Alice wears blue since 2010
Alice wears green since 2012
Joe wears pink since 2015
Joe wears red since 2015
Bob wears blue since 2016
Bob wears teal since 2016

1 Ответ

0 голосов
/ 08 января 2019

Надеюсь, окончательное редактирование после последних комментариев (но результат теперь соответствует вашему ожидаемому результату, так что я думаю, что мы хороши):

gremlin> g.V().hasLabel("Athlete").as("a").
           union(outE("wears").sack(assign).by("created"),
                 inE("contains").sack(assign).by("created").outV().
                 union(outE("wears").sack(max).by("created"),
                       inE("contains").sack(max).by("created").outV().
                       outE("wears").sack(max).by("created"))).
           filter(sack().is(gte(2009))).
           project("athlete","when","uniform").
             by(select("a").by("name")).
             by(sack()).
             by(inV().values("color"))
==>[athlete:Joe,when:2015,uniform:pink]
==>[athlete:Joe,when:2015,uniform:red]
==>[athlete:Jane,when:2009,uniform:teal]
==>[athlete:Jane,when:2009,uniform:blue]
==>[athlete:Alice,when:2012,uniform:green]
==>[athlete:Alice,when:2010,uniform:teal]
==>[athlete:Alice,when:2010,uniform:blue]
==>[athlete:Bob,when:2016,uniform:teal]
==>[athlete:Bob,when:2016,uniform:blue]

Или, поскольку ваша схема довольно однородна, вы можете использовать repeat() и таким образом избавиться от нечитаемых вложенных union() s:

gremlin> g.withSack(0).V().hasLabel("Athlete").as("a").
           emit().
             repeat(inE("contains").sack(max).by("created").outV()).
             times(2).
           outE("wears").sack(max).by("created").
           filter(sack().is(gte(2009))).
           project("athlete","when","uniform").
             by(select("a").by("name")).
             by(sack()).
             by(inV().values("color"))
==>[athlete:Joe,when:2015,uniform:pink]
==>[athlete:Joe,when:2015,uniform:red]
==>[athlete:Jane,when:2009,uniform:teal]
==>[athlete:Jane,when:2009,uniform:blue]
==>[athlete:Alice,when:2012,uniform:green]
==>[athlete:Alice,when:2010,uniform:teal]
==>[athlete:Alice,when:2010,uniform:blue]
==>[athlete:Bob,when:2016,uniform:teal]
==>[athlete:Bob,when:2016,uniform:blue]
...