Во-первых, вы можете сэкономить много времени, если вы разместите крошечный сценарий для создания образца графика вместо изображения.Примерно так:
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]}