Можем ли мы преобразовать Result в ResultSet в Vertex с помощью клиента gremlin - java? - PullRequest
0 голосов
/ 13 сентября 2018

Я использую пример Github для генерации графа (https://github.com/Azure-Samples/azure-cosmos-db-graph-java-getting-started).) И теперь я хочу запросить его и держать экземпляр вершины в моей руке, чтобы пройти дальше в зависимости от дополнительных входных данных пользователя в графе знаний.

Отправка запроса gremlin: g.V().hasLabel('schedule').inE().outV().hasLabel('url').as('a').dedup() .where(and(out().hasLabel('schedule').has('name','3'),out() .hasLabel('states').has('name', 'federal'))).select('a')

// Submitting remote query to the server.
ResultSet results = client.submit(query);

CompletableFuture<List<Result>> completableFutureResults = results.all();
List<Result> resultList = completableFutureResults.get();

for (Result result : resultList) {
    System.out.println("My vertex--"+result.getVertex());
    System.out.println("\nQuery result:");
    System.out.println("resultssssss-"+result.toString());
}

Как я могу это сделать, поскольку прямо сейчас я получаю исключение приведения класса, как указано ниже:

java.lang.ClassCastException: java.util.LinkedHashMap cannot be cast to org.apache.tinkerpop.gremlin.structure.Vertex
    at org.apache.tinkerpop.gremlin.driver.Result.getVertex(Result.java:131)
    at GetStarted.Dynamic.main(Dynamic.java:155)

1 Ответ

0 голосов
/ 13 сентября 2018

select('a') кажется мне излишним - я думаю, что это можно удалить. Он выбирает выход, который уже является текущим выходом where(), который уже является той вершиной на «а», что означает, что ваш обход должен быть:

g.V().hasLabel('schedule').
  in().hasLabel('url').
  dedup().
  where(and(out().hasLabel('schedule').has('name','3'),
            out().hasLabel('states').has('name', 'federal')))

Я полагаю, что дальнейшая оптимизация заключалась бы в том, чтобы сделать out() перед and(), чтобы вы проходили эти края только один раз:

g.V().hasLabel('schedule').
  in().hasLabel('url').
  dedup().
  where(out().and(has('schedule','name','3'),
                  has('states', 'name', 'federal')))

Теперь ... это возвращает Vertex, однако то, что вы имели, должно было также вернуть Vertex. По крайней мере, в соответствии со спецификациями TinkerPop, при выполнении select() для одной метки вы должны вернуть один объект. Однако, если вы сделаете несколько ярлыков, вы получите Map. Вы можете увидеть это на TinkerGraph здесь:

gremlin> g.V().hasLabel('person').as('a').out().as('b').select('a')
==>v[1]
==>v[1]
==>v[1]
==>v[4]
==>v[4]
==>v[6]
gremlin> g.V().hasLabel('person').as('a').out().as('b').select('a','b')
==>[a:v[1],b:v[3]]
==>[a:v[1],b:v[2]]
==>[a:v[1],b:v[4]]
==>[a:v[4],b:v[5]]
==>[a:v[4],b:v[3]]
==>[a:v[6],b:v[3]]

Это заставляет меня задуматься, правильно ли учтен этот маленький нюанс в CosmosDB - если нет, то это технически "ошибка".

...