以下
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.4
和dse-byos_2.11:5.1.4
使用Java API。
答案 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()) {}