2015-05-24 1 views
1

Мне сложно описать. В запросе Gremlin, который я пытаюсь написать, есть один узел в качестве входа. Затем я ищу все узлы с классом Group input. Тогда в каждой группе есть только один узел класса Text и несколько узлов Elem. Я хотел бы получить все узлы Elem, которые имеют один и тот же узел Text, даже если они принадлежат к различным узлам группы. Вы видите разный цвет группировок.Как сгруппировать все родственные узлы от разных родителей общим братом на графике с использованием Гремлина

Вот что я имею в виду:

enter image description here

То, что я до сих пор:

g = new OrientGraph("remote:localhost/graphdb") 
v = g.v('#12:109') 
v.bothE.has('@class','hasElem').outV.has('@class','Group').bothE.or(_().has('@class','hasText'), _().has('@class','hasElem').except([v])).inV().except([v]) 

Это возвращает мне все зеленые и синие узлы вместе, но я не знаю, как сделать группировку.

Любая помощь с благодарностью :)

Спасибо!

ответ

1

Потребовался 5hours, но я нашел запрос, который делает это:

groupBy отображения в основном принимает в качестве ключа текстового узла {it} и в качестве значения листа от text-> родительских,> двойников {it.inE.outV.outE.inV.hasNot('@class','Text').except([v])}, что не класса Text, за исключением ввода. Последняя строка сортирует тексты в нисходящей популярности, или, другими словами, те, у которых длинный список родственных братьев и сестер, идут первыми.

g = new OrientGraph("remote:localhost/graphdb") 
v = g.v('#12:109') 
m = [:] 
v.bothE.has('@class','hasElem').outV.has('@class','hasElem').dedup().bothE.has('@class','hasText').inV().groupBy(m){it}{it.inE.outV.outE.inV.hasNot('@class','Text').except([v])} 
m.sort{a,b -> b.value.size() <=> a.value.size()}