Gremlin Применение группирования по и пути итерации - PullRequest
0 голосов
/ 28 сентября 2018

В базе данных Azure Cosmos Graph DB есть следующая база данных Graph.enter image description here Я пытаюсь создать запрос, который возвращает следующий вывод:

Идеальный вывод

[
    "Person 1":{
        skills:[{"MS OFFICE":"PASS"}],
        orgPath:"Random Inc/"
    },
    "Person 2":{
        skills:[{".NET":"PASS"},{"Accounting":"FAIL"},{"Python":"PASS"}],
        orgPath:"Random Inc/Person 1/"
    },
    "Person 3":{
        skills:[{"MS OFFICE":"PASS"}],
        orgPath:"Random Inc/Person 1/"
    },
    "Person 4":{
        skills:[{"MS OFFICE":"FAIL"},{"Python":"PASS"}],
        orgPath:"Random Inc/Person 1/Person 3/"
    }

]

Однако я застреваю после начальной .group () .by () в gremlin.

Запрос пока что:

g.V().hasLabel('Person').group().by('name').by(outE('scored').inV().fold())

Мой текущий запрос возвращает список объектов JSON, ключом которых является имя узла человека, и внутри каждого JSONОбъект - это полное представление JSON каждого узла умений, назначенного этому конкретному человеку.

Вопросы:

  1. Есть ли способ выбора узла навыка для возврата шаблона skillName: skillValue?
  2. Можно ли также распечатать путьобход проходил по краю «isManagerOf»

1 Ответ

0 голосов
/ 28 сентября 2018

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

g.addV("Person").property("Name","Person 1").as("p1").
  addV("Person").property("Name","Person 2").as("p2").
  addV("Person").property("Name","Person 3").as("p3").
  addV("Person").property("Name","Person 4").as("p4").
  addV("Skill").property("skillName","MS OFFICE").
                property("skillVAL","PASS").as("msoP").
  addV("Skill").property("skillName","MS OFFICE").
                property("skillVAL","FAIL").as("msoF").
  addV("Skill").property("skillName",".NET").
                property("skillVAL","PASS").as("net").
  addV("Skill").property("skillName","Accounting").
                property("skillVAL","FAIL").as("acc").
  addV("Skill").property("skillName","Python").
                property("skillVAL","PASS").as("py").
  addV("Business").property("Name","Random INC").as("rnd").
  addE("scored").from("p1").to("msoP").
  addE("scored").from("p2").to("net").
  addE("scored").from("p2").to("acc").
  addE("scored").from("p2").to("py").
  addE("scored").from("p3").to("msoP").
  addE("scored").from("p4").to("py").
  addE("scored").from("p4").to("msoF").
  addE("isManagerOf").from("p1").to("p2").
  addE("isManagerOf").from("p1").to("p3").
  addE("isManagerOf").from("p3").to("p4").
  addE("employs").from("rnd").to("p1").
  addE("employs").from("rnd").to("p2").
  addE("employs").from("rnd").to("p3").
  addE("employs").from("rnd").to("p4").iterate()

Теперь, чтобы получить результат (почти) в точном формате, который вы описали, ваш запрос будет выглядеть так:

g.V().hasLabel("Person").as("p").
  project("name","skills","orgPath").
    by("Name").
    by(out("scored").
       group().
         by("skillName").
         by(values("skillVAL"))).
    by(__.as("v").
       until(select("v").hasLabel("Business")).
         repeat(select("v").
                coalesce(__.in("isManagerOf"),
                         __.in("employs")).
                project("i","v").
                  by(loops()).
                  by().as("iv")).
         select(all, "iv").unfold().
         order().
           by(select("i"), decr).
         select("v").values("Name").
         fold()).
  group().
    by(select("name")).
    by(select("skills","orgPath")).unfold()

Все group()По моему мнению, в этом нет необходимости, и он действительно нужен для того, чтобы получить результат в ожидаемом формате.Единственное, что не соответствует вашим ожиданиям, это orgPath - это список строк, а не одна строка с разделителями;это потому, что TinkerPop не поддерживает никаких операций с String (пока).

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

Тем не менее, результат запроса выше выглядит так:

==>Person 1={skills={MS OFFICE=PASS}, orgPath=[Random INC]}
==>Person 2={skills={Accounting=FAIL, .NET=PASS, Python=PASS}, orgPath=[Random INC, Person 1]}
==>Person 3={skills={MS OFFICE=PASS}, orgPath=[Random INC, Person 1]}
==>Person 4={skills={MS OFFICE=FAIL, Python=PASS}, orgPath=[Random INC, Person 1, Person 3]}
...