В Gremlin отсутствует что-то важное, чтобы сделать это по-настоящему простым - он не очень хорошо различает типы для целей фильтрации, поэтому TINKERPOP-2234 . Я немного изменил ваш пример, чтобы у нас было немного хитрее:
gremlin> g.V(1).repeat(outE().inV()).emit().path()
==>[v[1],e[9][1-created->3],v[3]]
==>[v[1],e[7][1-knows->2],v[2]]
==>[v[1],e[8][1-knows->4],v[4]]
==>[v[1],e[8][1-knows->4],v[4],e[10][4-created->5],v[5]]
==>[v[1],e[8][1-knows->4],v[4],e[11][4-created->3],v[3]]
С repeat()
мы получаем экземпляры переменной длины Path
, поэтому динамический подсчет вершиннемного хитрее, чем фиксированный пример, который у вас есть в вашем вопросе, где шаблон пути известен, и счет легко различить только из самого Гремлина. Таким образом, с динамическим количеством вершин и без TINKERPOP-2234 вы должны проявить творческий подход. Типичная стратегия состоит в том, чтобы просто отфильтровать ребра с помощью некоторой метки или значения свойства, уникального для вершин:
gremlin> g.V(1).repeat(outE().inV()).emit().path().map(unfold().hasLabel('person','software').fold())
==>[v[1],v[3]]
==>[v[1],v[2]]
==>[v[1],v[4]]
==>[v[1],v[4],v[5]]
==>[v[1],v[4],v[3]]
gremlin> g.V(1).repeat(outE().inV()).emit().path().map(unfold().hasLabel('person','software').fold()).count(local)
==>2
==>2
==>2
==>3
==>3
Или, возможно, использовать свойство, уникальное для всех ребер:
gremlin> g.V(1).repeat(outE().inV()).emit().path().map(unfold().not(has('weight')).fold())
==>[v[1],v[3]]
==>[v[1],v[2]]
==>[v[1],v[4]]
==>[v[1],v[4],v[5]]
==>[v[1],v[4],v[3]]
gremlin> g.V(1).repeat(outE().inV()).emit().path().map(unfold().not(has('weight')).fold()).count(local)
==>2
==>2
==>2
==>3
==>3
Если у вас нет этих свойств или меток в вашей схеме, которые позволяют это сделать, вы, вероятно, могли бы использовать свой шаблон обхода, чтобы придумать какую-то математику, чтобы понять это. В моем случае я знаю, что мой Path
всегда будет (pathLength + 1) / 2
, поэтому:
gremlin> g.V(1).repeat(outE().inV()).emit().path().as('p').math('(p + 1) / 2').by(count(local))
==>2.0
==>2.0
==>2.0
==>3.0
==>3.0
Надеюсь, один из этих способов вдохновит вас на решение.