迭代与GraphFrame一个GraphTraversal导致抛出UnsupportedOperat

2019-09-30 00:14发布

下列

    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()

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

Answer 1:

答案很简单:你需要投GraphTraversal到DseGraphTraversal有DF()方法。 然后使用的火花数据集方法收集行之一:

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

DseGraphFrame还不支持全TinkerPop有关规范。 所以,你不能接收TinkerPop有关顶点或边的对象。 ( limit()方法也没有在DSE 5.1.x中实现)。 建议切换到火花用df()调用数据集API,得到Dataset<Row>和使用数据集基地过滤和收集

如果你只需要边/顶点属性,你仍然可以使用TinkerPop有关valueMap()values()

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


文章来源: Iterating a GraphTraversal with GraphFrame causes UnsupportedOperationException Row to Vertex conversion