如何在单次遍历中添加一堆顶点和边以及 return 使用 DSE Graph 的子集:
How to add a bunch of vertices and edges in a single traversal and return a subset of those using DSE Graph:
目标:我试图在单次遍历中添加一堆顶点和边,return其中的一个子集。
可能是流利的 API 还在 Beta 中,或者我没有正确理解 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 并且我 select 两个.. 如果我 select 只有一个
grs.one().as(Vector.class)
工作正常...但现在我 select a 和 b ... grs.one() 和 grs.all() return 都导致 a list [] 和 obj {} .. iterator() 不能正常工作,因为 grs.all().count() 是 1.. 所以我得不到我需要的东西.. 假设 grs.all() return 是两个事物的迭代器,grs.one() return 是第一个事物的迭代器。
grs.all() return是这样的:
[{a=DefaultVertex{id={~label=Entity, community_id=903802240, member_id=515}, label=Entity, properties=com.google.common.collect.Iterators@3670f00}, b=DefaultVertex{id={~label=Entity, community_id=903802240, member_id=516}, label=Entity, properties=com.google.common.collect.Iterators@452e26d0}}]
grs.one() return 是这样的:
{a=DefaultVertex{id={~label=Entity, community_id=1220980480, member_id=514}, label=Entity, properties=com.google.common.collect.Iterators@10b892d5}, b=DefaultVertex{id={~label=Entity, community_id=1220980480, member_id=515}, label=Entity, properties=com.google.common.collect.Iterators@3d3f761a}}
Edit(试图遍历同一行中的多个事物(见评论):
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>
感谢任何帮助!
我不确定您的期望是什么,但是 select("a","b")
应该 return 单个 "row" 中的两个顶点。 all()
和 one()
的两个结果对我来说都不错。
这是一个疯狂的猜测;您可能正在寻找这样的东西:
g.addV("Entity").property("uuid","testuuid").union(identity(),
addV("Entity").property("uuid","testuuid3"))
此遍历将创建 2 个顶点并 return 它们在 2 个单独的行中。
更新
在下面的评论中弄清楚用例是迭代地图条目 return 在 GraphNode
中编辑(它是任何对象的包装器 return由 DSE 图编辑 API),答案应该是以下之一。
如果只需要第一个顶点:
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
目标:我试图在单次遍历中添加一堆顶点和边,return其中的一个子集。
可能是流利的 API 还在 Beta 中,或者我没有正确理解 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 并且我 select 两个.. 如果我 select 只有一个
grs.one().as(Vector.class)
工作正常...但现在我 select a 和 b ... grs.one() 和 grs.all() return 都导致 a list [] 和 obj {} .. iterator() 不能正常工作,因为 grs.all().count() 是 1.. 所以我得不到我需要的东西.. 假设 grs.all() return 是两个事物的迭代器,grs.one() return 是第一个事物的迭代器。
grs.all() return是这样的:
[{a=DefaultVertex{id={~label=Entity, community_id=903802240, member_id=515}, label=Entity, properties=com.google.common.collect.Iterators@3670f00}, b=DefaultVertex{id={~label=Entity, community_id=903802240, member_id=516}, label=Entity, properties=com.google.common.collect.Iterators@452e26d0}}]
grs.one() return 是这样的:
{a=DefaultVertex{id={~label=Entity, community_id=1220980480, member_id=514}, label=Entity, properties=com.google.common.collect.Iterators@10b892d5}, b=DefaultVertex{id={~label=Entity, community_id=1220980480, member_id=515}, label=Entity, properties=com.google.common.collect.Iterators@3d3f761a}}
Edit(试图遍历同一行中的多个事物(见评论):
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>
感谢任何帮助!
我不确定您的期望是什么,但是 select("a","b")
应该 return 单个 "row" 中的两个顶点。 all()
和 one()
的两个结果对我来说都不错。
这是一个疯狂的猜测;您可能正在寻找这样的东西:
g.addV("Entity").property("uuid","testuuid").union(identity(),
addV("Entity").property("uuid","testuuid3"))
此遍历将创建 2 个顶点并 return 它们在 2 个单独的行中。
更新
在下面的评论中弄清楚用例是迭代地图条目 return 在 GraphNode
中编辑(它是任何对象的包装器 return由 DSE 图编辑 API),答案应该是以下之一。
如果只需要第一个顶点:
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