Как добавить несколько вершин и ребер в одном обходе и вернуть подмножество из них, используя DSE Graph:
Цель: я пытаюсь добавить несколько вершин и ребер в один обход и вернуть их подмножество.
Возможно, что свободный API все еще находится в бета-версии или что я не правильно понял API:
Я думаю, что есть проблема с.select () и GraphResultSet one () и all (), но вот что я попробовал:
GraphTraversal<Vertex,Vertex> traversal = g.addV("Entity").property("uuid","testuuid").as("a")
.addV("Entity").property("uuid","testuuid3").as("b");
GraphStatement graphStatement = DseGraph.statementFromTraversal(traversal.select("a","b"));
GraphResultSet grs = dseSession.executeGraph(graphStatement.setGraphName("graph"));
Я создаю две вершины a, b и выбираю обе из них.. если я выбираю только одну grs.one().as(Vector.class)
работает нормально... но теперь, когда я выбираю a и b... grs.one () и grs.all () возвращают оба результата в списке [] и в obj {} .. iterator() не работать правильно, так как grs.all (). count () равен 1.. поэтому я не могу получить то, что мне нужно... при условии, что grs.all () возвращает итератор для двух вещей, а grs.one () возвращает первое,
grs.all () возвращает что-то вроде этого:
[{a=DefaultVertex{id={~label=Entity, community_id=903802240, member_id=515}, label=Entity, properties=com.google.common.collect.Iterators$3@3670f00}, b=DefaultVertex{id={~label=Entity, community_id=903802240, member_id=516}, label=Entity, properties=com.google.common.collect.Iterators$3@452e26d0}}]
grs.one () возвращает что-то вроде этого:
{a=DefaultVertex{id={~label=Entity, community_id=1220980480, member_id=514}, label=Entity, properties=com.google.common.collect.Iterators$3@10b892d5}, b=DefaultVertex{id={~label=Entity, community_id=1220980480, member_id=515}, label=Entity, properties=com.google.common.collect.Iterators$3@3d3f761a}}
Изменить (пытается перебрать несколько вещей в одной строке (см. Комментарии):
GraphNode ga = grs.all().iterator().next(); // this contains both a and b
System.out.println(ga.getClass()); // this is ObjectGraphNode :/
Я использую:
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>dse-driver</artifactId>
<version>1.1.1-beta1</version>
</dependency>
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>java-dse-graph</artifactId>
<version>1.0.0-beta1</version>
</dependency>
Любая помощь приветствуется!
1 ответ
Я не уверен, что вы ожидаете, но select("a","b")
должен возвращать обе вершины в одной "строке". Оба результата, для all()
а также one()
хорошо выглядишь для меня.
Вот дикая догадка; вы, вероятно, ищете что-то вроде этого:
g.addV("Entity").property("uuid","testuuid").union(identity(),
addV("Entity").property("uuid","testuuid3"))
Этот обход создаст 2 вершины и вернет их в 2 отдельных ряда.
ОБНОВИТЬ
После выяснения в комментариях ниже, что сценарий использования должен был перебрать записи карты, возвращенные в GraphNode
(который является оберткой для любого объекта, возвращаемого API-интерфейсом DSE), ответ должен быть одним из следующих.
Если вам нужна только первая вершина:
executeGraph(statementFromTraversal(
g.addV("Entity").property("uuid","testuuid").sideEffect(
addV("Entity").property("uuid","testuuid3"))).one().asVertex()
Если вам нужна только вторая вершина:
executeGraph(statementFromTraversal(
g.addV("Entity").property("uuid","testuuid").
addV("Entity").property("uuid","testuuid3")).one().asVertex()
Если вам нужны все / несколько вершин:
GraphNode n = executeGraph(statementFromTraversal(
g.addV("Entity").property("uuid","testuuid").as("a").
addV("Entity").property("uuid","testuuid3").as("b").select("a","b")).one()
n.get("a").asVertex() // work w/ vertex a
n.get("b").asVertex() // work w/ vertex b