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

Iterating a GraphTraversal with GraphFrame causes UnsupportedOperationException Row to Vertex conversion

以下

    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。

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

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

DseGraphFrame 尚不支持完整的 TinkerPop 规范。所以你不能接收 TinkerPop Vertex 或 Edge 对象。 (limit() 方法在 DSE 5 中也未实现。1.x)。建议切换到spark dataset api with df() call, get Dataset<Row> 并使用Dataset base filtering and collecting

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

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