DseGraphFrameでのTinkerPop APIサポート

DseGraphFrameでは、Apache TinkerPop探索APIのサブセットをサポートしています。

DseGraphFrameでは、Apache TinkerPop探索APIのサブセットをサポートしています。

DseGraphFrameでは、org.apache.tinkerpop.gremlin.process.traversal.Traverserorg.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffectsはサポートしていません。

サポートされているメソッド

DseGraphFrameは、E()V()の2つのメソッドを定義して、TinkerPopグラフの探索ソースを模倣します。これらのメソッドによって、以下に定義するすべてのメソッドを持つGraphTraversalが返されます。限られた一連のTinkerPopのStepクラスのみがサポートされています。以下の表以外の手順を実行すると、UnsupportedExceptionがスローされます。

表 1. TinkerPop読み取りメソッド
手順 メソッド
CountGlobalStep count()
GroupCountStep groupCount()
IdStep id()
PropertyValuesStep values()
PropertyMapStep propertyMap()
HasStep has(), hasLabel()
IsStep is()
VertexStep to(), out(), in(), both(), toE(), outE(), inE(), bothE()
EdgeVertexStep toV(), inV(), outV(), bothV()
NotStep not()
TraversalFilterStep where()
AndStep and(A,B)
PageRankVertexProgramStep pageRank()
DedupGlobalStep dedup()
OrderGlobalStep order()
LimitGlobalStep limit()
SelectStep as()およびselect()
OrStep or()

DseGraphFrameを使用すると、数百万もの頂点やエッジを一度に削除できるため、Gremlin OLAPやOLTPよりもはるかに高速でプロパティの一括更新を行うことができます。

たとえば、このクエリーでは、すべてのperson頂点とこれに関連するエッジが削除されます。

scala> g.V().hasLabel("person").drop().iterate()

このクエリーによって、お互いを知っている人物が検索されるほか、as()メソッドとselect()メソッドが示されています。

scala> g.V().as("a").out("knows").as("b").out("knows")
  .where(P.eq("a")).select("a", "b").by("name").show
+-----+-----+
|  a  |  b  |
+-----+-----+
|Alice| Bob |
| Bob |Alice|
+-----+-----+
表 2. TinkerPopの更新手順およびメソッド
手順 メソッド
DropStep V().drop(), E().drop(), properties().drop()
AddPropertyStep property(name, value, ...)

ScalaでのDseGraphFrameの使用

GraphTraversalはJavaインターフェースで、Java Iteratorインターフェイスを拡張します。探索の結果をDataFrameとして繰り返すには、df()メソッドを使用します。DseGraphFrameでは、DataFrameへの暗黙的変換がサポートされています。

以下の例では、TinkerPopを使用してグラフの頂点を探索し、結果をDataFrameとして表示します。

scala> g.V().out().show

場合によっては、TinkerPop Java APIを使用して、正しいTinkerPopオブジェクトを取得しなければならないことがあります。

たとえば、DSE Graph Idオブジェクトを抽出するには、Traversal JavaイテレータをScalaイテレータに変換して、IdのTinkerPop表示に直接アクセスできるようにします。このメソッドを使用すると、IdDataFrame String表示を返すDataFrameメソッドの代わりに、元のIdを使用することができます。また、toList()メソッドとtoSet()メソッドを使用して、適切なIDを設定することもできます。

scala> import scala.collection.JavaConverters._
scala> for(i <-g.V().id().asScala) println (i)
{~label=vertex, community_id=748226688, member_id=0}
{~label=custom, name=Name, value=1}
scala> g.V.id.toSet
res18: java.util.Set[Object] = [{~label=demigod, community_id=224391936, member_id=0}, ...

TinkerPopのP(述語)クラスとT(定数)クラスはSparkシェルによって自動的にインポートされます。

scala> g.E().groupCount().by(T.label)
scala> g.V().has("age", P.gt(30)).show

スタンドアローン・アプリケーションの場合は、これらのクラスをインポートします。

import org.apache.tinkerpop.gremlin.structure.T
import org.apache.tinkerpop.gremlin.process.traversal.P
import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__

Scalaは、特にSparkシェルにおいて戻り値の型を推測できないことがあります。この型のプロパティ値は明示的に指定する必要があります。

scala> g.V().values[Any]("name").next()

また、同様に以下のように指定します。

val n: String = g.V().values("name").next()

プロパティを削除する際も、型を明示的に設定してください。

scala> g.V().properties[Any]("age", "name").drop().iterate()

この例では、型を指定する必要がないため、DataFrame APIを使用する方が簡単です。

scala> g.V().properties("age", "name").drop().show()
++
||
++
++
scala>  g.V().values("age").show()
+-----+
|  age|
+-----+
|10000|
表 3. DseGraphFrame ScalaアプリケーションでのJavaメソッドの使用
メソッド ユース・ケース
hasNext() 結果があるかどうか知りたいが、値は重要ではない場合。 Aliceは他の頂点を作成しました。
g.V().has("name", "Alice").outE("created").hasNext()
next() 少なくとも1つの結果があることがわかっており、最初の結果を取得したい(または2回呼び出した場合は2番目の結果)場合。 頂点ラベルの分散を取得します。グループ手順は常に結果を1件返します。
g.V().groupCount().by(label).next()
iterate() 探索を実行したいが、結果や処理は重要ではない場合。 全員の年齢を10に設定します。
g.V().property("age", 10).iterate()
toList()toSet() 結果に任意の数の項目が含まれており、その項目をすべて取得したい場合。 Aliceが知っている人を全員取得します。
g.V().has("name", "Alice").out("knows").toList()