使用GraphFrame迭代GraphTraversal会导致UnsupportedOperationException Row to Vertex转换

时间:2018-01-18 08:17:05

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

以下

    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)

异常表示使用.df().collect(),但gf().E().hasLabel("foo")之后不允许您.df()。换句话说,df()

返回的对象不存在方法hasLabel()

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

1 个答案:

答案 0 :(得分:3)

简短回答:您需要将GraphTraversal强制转换为具有df()方法的DseGraphTraversal。然后使用spark数据集方法之一来收集行:

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

DseGraphFrame尚不支持完整的TinkerPop规范。因此,您无法接收TinkerPop Vertex或Edge对象。 (limit()方法也未在DSE 5.1.x中实现。建议使用df()调用切换到spark数据集api,获取Dataset<Row>并使用数据集基过滤和收集

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

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