【问题标题】:Iterating a GraphTraversal with GraphFrame causes UnsupportedOperationException Row to Vertex conversion使用 GraphFrame 迭代 GraphTraversal 会导致 UnsupportedOperationException 行到顶点的转换
【发布时间】:2018-06-27 05:59:30
【问题描述】:

以下

    GraphTraversal<Row, Edge> traversal = gf().E().hasLabel("foo").limit(5);
    while (traversal.hasNext()) {}

导致以下异常:

java.lang.UnsupportedOperationException: Row to Vertex conversion is not supported: Use .df().collect() instead of the iterator

    at com.datastax.bdp.graph.spark.graphframe.DseGraphTraversal.iterator$lzycompute(DseGraphTraversal.scala:92)
    at com.datastax.bdp.graph.spark.graphframe.DseGraphTraversal.iterator(DseGraphTraversal.scala:78)
    at com.datastax.bdp.graph.spark.graphframe.DseGraphTraversal.hasNext(DseGraphTraversal.scala:129)

Exception 说要使用.df().collect(),但gf().E().hasLabel("foo") 不允许你事后使用.df()。换句话说,方法df() 不存在hasLabel() 返回的对象

我通过dse-graph-frames:5.1.4 和dse-byos_2.11:5.1.4 使用Java API。

【问题讨论】:

    标签: datastax datastax-enterprise datastax-java-driver datastax-enterprise-graph


    【解决方案1】:

    简短的回答:您需要将 GraphTraversal 转换为具有 df() 方法的 DseGraphTraversal。然后使用其中一种 spark Dataset 方法来收集 Rows:

    List<Row> rows =
       ((DseGraphTraversal)graph.E().hasLabel("foo"))
       .df().limit(5).collectAsList();
    

    DseGraphFrame 还不支持完整的 TinkerPop 规范。所以你不能接收 TinkerPop Vertex 或 Edge 对象。 (limit() 方法也未在 DSE 5.1.x 中实现)。建议使用df()调用切换到spark dataset api,获取Dataset&lt;Row&gt;并使用Dataset base过滤和收集

    如果您只需要 Edge/Vertex 属性,您仍然可以使用 TinkerPop valueMap() 或 values()

        GraphTraversal<Row, Map<String,Object>> traversal = graph.E().hasLabel("foo").valueMap();
        while (traversal.hasNext()) {}
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-16
      • 1970-01-01
      • 1970-01-01
      • 2019-02-27
      • 1970-01-01
      • 2017-01-09
      相关资源
      最近更新 更多