DseGraphFrameでのTinkerPop APIサポート
DseGraphFrameでは、Apache TinkerPop探索APIのサブセットをサポートしています。
DseGraphFrame
では、Apache TinkerPop探索APIのサブセットをサポートしています。
DseGraphFrame
では、org.apache.tinkerpop.gremlin.process.traversal.Traverser
やorg.apache.tinkerpop.gremlin.process.traversal.TraversalSideEffects
はサポートしていません。
サポートされているメソッド
DseGraphFrame
は、E()
とV()
の2つのメソッドを定義して、TinkerPopグラフの探索ソースを模倣します。これらのメソッドによって、以下に定義するすべてのメソッドを持つGraphTraversal
が返されます。限られた一連のTinkerPopのStep
クラスのみがサポートされています。以下の表以外の手順を実行すると、UnsupportedException
がスローされます。
手順 | メソッド |
---|---|
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() |
このクエリーによって、お互いを知っている人物が検索されるほか、as()
メソッドとselect()
メソッドが示されています。
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|
+-----+-----+
手順 | メソッド |
---|---|
DropStep |
V().drop() , E().drop() , properties().drop() |
AddPropertyStep |
property(name, value, ...) |
DseGraphFrame
を使用すると、数百万もの頂点やエッジを一度に削除できるため、Gremlin OLAPやOLTPよりもはるかに高速でプロパティの一括更新を行うことができます。
たとえば、このクエリーでは、すべてのperson
頂点とこれに関連するエッジが削除されます。
g.V().hasLabel("person").drop().iterate()
ScalaでのDseGraphFrameの使用
GraphTraversal
はJavaインターフェースで、Java Iterator
インターフェイスを拡張します。探索の結果をDataFrame
として繰り返すには、df()
メソッドを使用します。DseGraphFrame
では、DataFrame
への暗黙的変換がサポートされています。
以下の例では、TinkerPopを使用してグラフの頂点を探索し、結果をDataFrameとして表示します。
g.V().out().show
場合によっては、TinkerPop Java APIを使用して、正しいTinkerPopオブジェクトを取得しなければならないことがあります。
たとえば、DSE Graph Id
オブジェクトを抽出するには、Traversal
JavaイテレータをScalaイテレータに変換して、Id
のTinkerPop表示に直接アクセスできるようにします。このメソッドを使用すると、Id
のDataFrame
String
表示を返すDataFrame
メソッドの代わりに、元のId
を使用することができます。また、toList()
メソッドとtoSet()
メソッドを使用して、適切なIDを設定することもできます。
import scala.collection.JavaConverters._ for(i <-g.V().id().asScala) println (i)
{~label=vertex, community_id=748226688, member_id=0} {~label=custom, name=Name, value=1}
g.V.id.toSet
res18: java.util.Set[Object] = [{~label=demigod, community_id=224391936, member_id=0}, ...
TinkerPopのP(述語)クラスとT(定数)クラスはSparkシェルによって自動的にインポートされます。
g.E().groupCount().by(T.label) 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シェルにおいて戻り値の型を推測できないことがあります。この型のプロパティ値は明示的に指定する必要があります。
g.V().values[Any]("name").next()
また、同様に以下のように指定します。
val n: String = g.V().values("name").next()
プロパティを削除する際も、型を明示的に設定してください。
g.V().properties[Any]("age", "name").drop().iterate()
この例では、型を指定する必要がないため、DataFrame
APIを使用する方が簡単です。
g.V().properties("age", "name").drop().show()
++ || ++ ++
g.V().values("age").show()
+-----+ | age| +-----+ |10000|
メソッド | 使用事例 | 例 |
---|---|---|
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() |