【问题标题】:How to add a bunch of vertices and edges in a single traversal and return a subset of those using DSE Graph:如何在一次遍历中添加一堆顶点和边并返回使用 DSE Graph 的子集:
【发布时间】:2017-05-06 19:22:07
【问题描述】:

目标:我试图在一次遍历中添加一堆顶点和边并返回其中的一个子集。

可能是 Fluent 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 并且我选择了它们。如果我只选择一个 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}}

编辑(尝试迭代同一行中的多个事物(参见 cmets):

   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>

感谢任何帮助!

【问题讨论】:

    标签: datastax gremlin datastax-enterprise-graph


    【解决方案1】:

    我不确定您的期望是什么,但select("a","b") 应该在一个“行”中返回两个顶点。 all()one() 的两个结果在我看来都不错。

    这是一个疯狂的猜测;你可能正在寻找这样的东西:

    g.addV("Entity").property("uuid","testuuid").union(identity(),
      addV("Entity").property("uuid","testuuid3"))
    

    此遍历将创建 2 个顶点并将它们返回到 2 个单独的行中。

    更新

    在下面的 cmets 中弄清楚用例是迭代 GraphNode(这是 DSE Graph 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
    

    【讨论】:

    • 不要修改我的遍历:)。只有 1 个g
    • 嗯,你需要知道元素类型。 select("a","b") 将发出 Maps。您可以获取第一个地图,然后在您的 java 应用程序中执行类似 map.entrySet() 的操作,以获取所有条目的迭代器。
    • github.com/datastax/java-dse-graph/blob/1.x/java-dse-graph/src/…result.fieldNames() 将为您提供所有键(在您的示例中为 ab),result.get(key) 将返回特定键的值。
    • 哈,好的,我会将所有用例添加到我的答案中。
    • 你可以提示select只会选择Vertex类型的对象:Vertex v = g.addV("User").as("a").addV("User").as("b").&lt;Vertex&gt;select("a","‌​b"‌​).next().get("b");
    猜你喜欢
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 2017-06-12
    • 2016-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多