Я не уверен, какую базу данных графов вы используете, но я несколько удивлен, что вы не получите ошибку с этим битом Gremlin, и эта ошибка должна дать подсказку о том, что не так.
gremlin> g.V().has('person','name','marko').repeat(addE('knows').from(V().has('person','name','stephen'))).times(5)
org.apache.tinkerpop.gremlin.tinkergraph.structure.TinkerEdge cannot be cast to org.apache.tinkerpop.gremlin.structure.Vertex
Type ':help' or ':h' for help.
Display stack trace? [yN]
Шаг repeat()
не предназначен для простого выполнения одного и того же дочернего обхода с одинаковыми входными данными для каждой итерации. Он предназначен для выполнения того же дочернего обхода с выходом предыдущей итерации, что и для нового ввода. Это означает, что на первой итерации мы инициализируем этот дочерний обход:
addE('knows').from(V().has('person','name','stephen'))
с вершиной "marko", но результат этого обхода равен Edge
(потому что результат addE()
равен Edge
). На второй итерации это ребро становится входом для addE()
и, следовательно, .... error .... поскольку вы не можете вызвать addE()
для ребра.
Если вы хотите использовать repeat()
для этого типа управления потоком, вы можете, однако, но вы должны организовать дочерний обход так, чтобы входные данные были той же начальной вершиной на каждой итерации:
gremlin> g.addV('person').property('name','marko').addV('person').property('name','stephen').iterate()
gremlin> g.V().has('person','name','marko').as('m').
......1> V().has('person','name','stephen').as('s').
......2> repeat(select('m').addE('knows').to('s')).
......3> times(3).iterate()
gremlin> g.E()
==>e[4][0-knows->2]
==>e[5][0-knows->2]
==>e[6][0-knows->2]