Использование repeat () и times () для создания нескольких ребер одновременно - PullRequest
1 голос
/ 14 июня 2019

Как использовать шаг times () для моего повтора (..), чтобы создать несколько одинаковых ребер одновременно?

g.V().has('Label1', 'id', '1234').repeat(addE('HAS').from(g.V().has('Label2', 'id', '5678'))).times(5)

Я бы подумал, что он добавляет мое ребро 5 раз к этой вершине, фактически он ничего не возвращает, когда times () больше 1. Почему это так и как мне правильно использовать repeat ()?

1 Ответ

0 голосов
/ 14 июня 2019

Я не уверен, какую базу данных графов вы используете, но я несколько удивлен, что вы не получите ошибку с этим битом 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]
...