Gremlin.Net возвращает несколько суб-вершин в том же массиве

Обычно семья состоит из одного отца и матери, но многодетных. По гремлину я могу сказать, чтобы получить семью:

g.V(61464).as('me').outE('father').inV().as('father').select('me').outE('mother').inV().as('mother').select('me').inE('father').outV().as('child').select('father', 'mother', 'child')

это вернет следующее:

 - ==> *{father=v[16408], mother=v[450608], child=v[139504]}*
 - ==> *{father=v[16408], mother=v[450608], child=v[163880]}*
 - ==> *{father=v[16408], mother=v[450608], child=v[176368]}*

но я хочу получить их таким образом:

==> {отец = v [16408], мать = v [450608], дети = [v [139504], v [163880], v [176368]]

Есть ли способ сделать это в gremlin и более конкретно в Gremlin.Net. Спасибо


person janus graph    schedule 13.01.2018    source источник
comment
Было бы полезно иметь образец графика в форме запросов Gremlin, который можно скопировать в консоли Gremlin, когда вы задаете вопросы Gremlin. Так вам будет намного легче помочь.   -  person Florian Hockmann    schedule 13.01.2018


Ответы (1)


Самый простой способ сделать это, вероятно, - использовать project шаг:

gremlin> g.V(61464).project('father','mother','children').
             by(out('father')).
             by(out('mother')).
             by(__.in('father').fold())
==>[father:v[4344],mother:v[4152],children:[v[8440],v[12536],v[40964200]]]

(Идентификаторы не совпадают с вашими, так как мне пришлось самому создать график и получить другие идентификаторы.)

Обратите внимание, что __ для __.in('father') необходимо только для Gremlin-Groovy, поскольку in - зарезервированное ключевое слово в Groovy, а out('father') - более короткая форма outE('father').inV().

Вы можете написать такой же обход в Gremlin.Net. Тогда это выглядит так:

g.V(61464).Project<object>("father", "mother", "children").
            By(Out("father")).
            By(Out("mother")).
            By(In("father").Fold()).Next();

(Вам нужен using static Gremlin.Net.Process.Traversal.__;, чтобы иметь возможность написать такой обход. В противном случае By-шагов будут выглядеть так: By(__.Out("father")). См. Документацию TinkerPop для подробнее об этом.)

person Florian Hockmann    schedule 13.01.2018
comment
Большое спасибо, очень помогли :) - person janus graph; 13.01.2018
comment
Привет, Флориан Хокманн, когда я использую этот g.V (61464) .Project ‹object› (отец, мать, дети). By (Out (отец)). By (Out (мать)). By (In (отец) .Fold ()). Next (); если у выбранной вершины нет отца, запрос прерывается, как я могу этого избежать? - person janus graph; 16.01.2018
comment
Я не уверен, что это лучшее решение, но один из способов решить эту проблему - использовать шаг объединения: By(Out("father")) становится By(Coalesce<object>(Out("father"), Constant("has no father"))). Coalesce приводит к тому, что шаг Constant будет выполнен, когда Out("father") не вернет вершин. - person Florian Hockmann; 16.01.2018