SlideShare ist ein Scribd-Unternehmen logo
1 von 66
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
Oracle Labs 発!
Parallel Graph AnalytiX(PGX)
2017年10月3日 更新
日本オラクル株式会社
山中遼太(ryota.yamanaka@oracle.com)
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
Safe Harbor
以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。
また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むこと
はできません。以下の事項は、マテリアルやコード、機能を提供することを
コミットメント(確約)するものではないため、購買決定を行う際の判断材料に
なさらないで下さい。オラクル製品に関して記載されている機能の開発、
リリースおよび時期については、弊社の裁量により決定されます。
Oracle と Java は、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における
登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。
2
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 3
グラフ・データベース?
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
ネットワーク分析とグラフ
• さまざまな関係構造をネットワークとして扱うことができる
• このネットワークを点と線の集合として抽象化したものがグラフ
• グラフ理論は数学の一つとして古くから発展してきた
4
1736年 ケーニヒスベルグの問題(オイラー) 無向/有向グラフ、多重グラフ、重み、…
※ 出典 (ライセンス: CC BY-SA 3.0) https://ja.wikipedia.org/wiki/一筆書き/media/File:7_bridges.svg
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフ・データベース
5
DB-Engines に掲載のカテゴリ別人気変化率
(http://db-engines.com/en/ranking_categories)
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
データを表に格納する
6
deptno dname loc
1 営業第一 東京
2 研究開発 大阪
3 マーケティング 東京
empno ename job deptno
1 アルバート 課長 1
2 バクスター 主任研究員 2
3 チェン 係長 3
4 デイヴィス エンジニア 2
社員表
部門表
主キー
主キー
外部キー
SELECT e.ename
FROM emp e, dept d
WHERE
e.deptno = d.deptno
AND d.loc = 'Tokyo'
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
データをグラフに格納する
プロパティ・グラフなら、簡単かつ柔軟に表現することができ、
さらに、グラフ用の直感的なクエリ言語で検索することができる
7
SELECT e.ename
WHERE
(e)-[belong_to]->(d)
, d.loc = 'Tokyo'
1
1
2
3
4
2
3
dname: 営業第一
loc: 東京
ename: アルバート
job: 営業
belong_to
from: 2013
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
誰が最重要人物か? ― つながりの定量化
• 集計を用いた手法
• 誰が多く支払ったか?
• 誰が高いマージンの商品を買ったか?
• 誰が継続的に購入しているか?
• つながりを用いた手法
• 誰が強い影響力を周りに対して持っているか?
• 誰が特定人物と同じ商品を購入しているか?
• 誰が若い世代のコミュニティに属しているか?
8
表に対する問い
SQLのような計算
方法が適している
グラフに対する問い
なにか別の計算方法
が必要とされている!
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 9
グラフ分析エンジン「PGX」
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
Spatial and Graph オプション
10
Oracle Database Enterprise Edition 12c R2
Graph機能
ネットワーク・
データ・モデル
RDF セマンティック
・グラフ
Spatial機能
プロパティ・グラフ
Spatial and Graph オプション
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフ・データベースが最適?
11
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
インメモリ解析 + 永続化ストレージ
12
RDBMS, Hadoop,
NoSQL (KVS)
Reques
t
分析
処理
Reques
t
Reques
t
Reques
t
Reques
t
更新
処理
PGX
PGX
メモリ上
データを並列処理で読み込み
ノードとエッジとしてメモリ上に展開
Oracle Labs で開発された高速な
インメモリのグラフ分析エンジン
トランザクションはデータベースやHadoopで処理
グラフ用クエリ言語 PGQL や、定義済み
グラフ分析アルゴリズムを API から使用可能
(ただし PGQL は DB 12.2.0.1 では未サポート)
File
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
Oracle Labs PGX
13
Oracle Labs(旧 Sun Labs)から OTN ライセンスで配布
• 商用利用はできませんが、無償で検証や開発ができます。
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフ分析における2種類の処理
• 参照系処理
• あるノードの周辺ノードの参照
• プロパティ・パスによる探索
• パターン・マッチング
• サブグラフの抽出
14
• 演算系処理
• コンポーネントやコミュニティの検出
• コミュニティ構造の評価
• ランキングとウォーキング
• 経路探索
3
1
5
2
5
4
2
3
2
3
2
2
1
22
1
1
1
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
PGX のコンセプト
• 参照系処理と演算系処理の双方、
これらを組み合わせた処理に対応
• グラフのクエリによる参照(PGQL)
• グラフへのアルゴリズムの適用
• グラフの変換(Mutation)
「あるノードから3ステップ
以内にあるページランクの
高いノード」を探す、など
15
3
1
5
2
5
4
2
3
2
3
2
2
1
22
1
1
1
3
1
5
2
5
4
2
3
2
3
2
2
1
22
1
1
1
演算!
参照!
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
参照系処理 ― クエリ言語によるグラフの参照
• Neo4j Cypher に似たクエリ言語「PGQL」によってグラフを参照可能
• グラフのパターンを直感的に記述できる:
• 「年齢がマリオより2歳下より若く、マリオとルイージが共に好いている
全ての人物の名前と年齢を、名前順に教えてください」
16
SELECT person.name, person.age
WHERE
(m WITH name='Mario') -[WITH type='likes']-> (person),
(l WITH name='Luigi') -[WITH type='likes']-> (person),
person.age < m.age - 2
ORDER BY person.name
• 仕様詳細はこちら: PGQL 1.0 Specification
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
演算系処理 ― 定義済みの35のアルゴリズム
17
コンポーネントやコミュニティの検出
強連結成分分解
(Tarjan法、Kosaraju法)
弱連結コンポーネント
ラベル伝搬法
ランキングとウォーキング
ページランク、
パーソナライズドページランク
中心媒介性、次数分布、次数中心性
近接中心性、固有ベクトル中心性
HITS、ランダムウォークサンプリング
コミュニティ構造の評価
∑ ∑
コンダクタンス
モジュール性
クラスタ係数
トライアングル数え上げ
経路探索
幅優先探索、ダイクストラ法
双方向ダイクストラ法
ベルマン・フォード法
その他 リンク予測(SALSA)
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフが利用されるビッグデータ課題
18
購買記録
顧客と商品
リコメンデーション
影響力のある
人物の特定
パターン・マッチングコミュニティの検出
私と買い物が似ている人
物によって購入された商
品と、その商品と一緒に
購入されている商品を教
えてください
ソーシャル・ネットワー
ク上で中心的な役割を
担っている人物を教えて
ください(マーケティン
グ分析など)
似通った人達やつながり
のある人達のグループを
教えてください(ター
ゲット・マーケティング
など)
ある不正取引と同様の取
引パターンがみられる全
ての預金口座を探してく
ださい(不正検出や行動
分析など)
Twitterなど
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 19
使ってみる
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
PGX のセットアップ(Linux)
20
$ cd $HOME/pgx # ここにファイルを置くとします
$ unzip pgx-2.5.0-server.zip
$ tar xvzf jdk-8u111-linux-x64.tar.gz
$ export JAVA_HOME=$HOME/pgx/jdk1.8.0_111
$ export PATH=$JAVA_HOME/bin:$PATH
$ export PGX_HOME=$HOME/pgx/pgx-2.5.0
$ alias pgx='$PGX_HOME/bin/pgx'
環境変数とエイリアスを設定します
ファイルを展開します
最新版の PGX 2.5.0 Server をこちらからダウンロードします
JDK8(下記では 8u111)もこちらからダウンロードします
参考 Oracle Labs PGX 2.5.0 Documentation – Installation
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
PGX のセットアップ(Mac)
21
$ cd $HOME/pgx # ここにファイルを置くとします
$ unzip pgx-2.5.0-server.zip
$ export 
JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/
$ export PATH=$JAVA_HOME/bin:$PATH
$ export PGX_HOME=$HOME/pgx/pgx-2.3.1
$ alias pgx='$PGX_HOME/bin/pgx'
環境変数とエイリアスを設定します
ファイルを展開します
最新版の PGX 2.5.0 Server をこちらからダウンロードします
JDK8(下記では 8u111)もこちらからダウンロードしてインストールします
参考 Oracle Labs PGX 2.5.0 Documentation – Installation
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
PGX シェルの起動
22
$ pgx
..
pgx>
PGXシェルを起動します
pgx> :exit
PGXシェルを閉じるとき
pgx> :clear
PGXシェルの誤入力でエラーが発生した際はヒストリーをクリアしてください
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフの読み込み
23
$ cd $PGX_HOME
$ pgx
PGXシェルを起動します
G = session.readGraphWithProperties("examples/graphs/sample.adj.json")
G.queryPgql(" SELECT x.id(), y.id() WHERE (x)-->(y) ").print()
x.id() y.id()
============================================
333 128
128 1908
128 99
99 333
サンプルのデータをロードした後、全てのエッジを参照します
333
128
1908
99
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
Marvel ヒーローのグラフ
• Marvel のコミックには
多くのキャラクターが登場
• さらに、ヒーロー達が集まって
敵と戦ったり、他のコミックに
友情出演することが多々ある
• そこでキャラクターの共演を
グラフにして解析する
24
※ 出典 http://www.oracle.com/us/theavengers
/avengers-main-body-1571184.html
(壁紙もダウンロードできます)
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
データの入手
25
$ more hero-network.csv
"IRON MAN/TONY STARK ","CHAIN"
"IRON MAN/TONY STARK ","SPIDER-WOMAN II/JULI"
"IRON MAN/TONY STARK ","CARPENTER, RACHEL"
"CARPENTER, RACHEL","CHAIN"
"CARPENTER, RACHEL","SPIDER-WOMAN II/JULI"
..
Exposedata.com (http://exposedata.com/marvel/) のウェブ・アーカイブの
「Hero Social Network Data」からCSVデータを入手します
このデータは、キャラクターをノードとして、コミックの同じ号に登場している
キャラクター同士をカンマ区切りで対にしただけのものです
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフのロード
26
G = session.readGraphWithProperties("hero/hero-network.csv.json").undirect()
$ vi hero-network.csv.json
{
"uri": "hero-network.csv"
, "format": "edge_list"
, "node_id_type": "string"
, "separator": ","
}
$ pgx
グラフのロードのための情報をJSONで記述します
PGXシェルから上のファイルを指定してグラフをロードします
(無向グラフとして読み込んでいます)
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフのロード
27
キャラクター(ノード)を表示します
G.queryPgql(" SELECT x.id() WHERE (x) ").print()
G.queryPgql(" SELECT x.id() WHERE (x) ").getNumResults()
==> 6426
キャラクター(ノード)の数を表示します
G.queryPgql(" SELECT r.id() WHERE (x)-[r]-(y) ").getNumResults()
==> 1146702
一緒に登場するキャラクターの組(エッジ)の数を表示します
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフのロード
28
G = G.simplify( 
MultiEdges.REMOVE_MULTI_EDGES 
, SelfEdges.REMOVE_SELF_EDGES 
, TrivialVertices.REMOVE_TRIVIAL_VERTICES 
, Mode.CREATE_COPY 
, null 
)
ロードしたグラフに前処理を施します
G.queryPgql(" SELECT r.id() WHERE (x)-[r]-(y) ").getNumResults()
==> 334414
一緒に登場するキャラクターの組(エッジ)の数を表示します
# 同じ2つのノードを結ぶ複数のエッジを除去
# 始点と終点が同じノードのエッジを除去
# エッジを持たないノードを除去
# 内部的にグラフのコピーを作成
# グラフ名(任意)
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
参照型処理の実行
PGQLは参照型処理(パターン・マッチング)に便利です
「アイアンマンとスパイダーマンとウルヴァリンの全てと
一緒に登場したことのあるキャラクターは?」
29
G.queryPgql(" 
SELECT x.id() 
WHERE 
(x)--(a WITH id()='IRON MAN/TONY STARK ') 
, (x)--(b WITH id()='SPIDER-MAN/PETER PAR') 
, (x)--(c WITH id()='WOLVERINE/LOGAN ') 
").print()
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
参照型処理の実行
結果の件数が多いので、一度、結果データを変数に渡して件数を数えます
30
Result = G.queryPgql(" 
SELECT x.id() 
WHERE 
(x)--(a WITH id()='IRON MAN/TONY STARK ') 
, (x)--(b WITH id()='SPIDER-MAN/PETER PAR') 
, (x)--(c WITH id()='WOLVERINE/LOGAN ') 
")
Result.getNumResults()
==> 504
10件だけ見てみます
Result.print(5)
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
ヒーローの重要度の評価
• 次数中心性
• より多くのエッジを持つノードがより重要
• 友だちが多い人は重要人物?
• ページランク
• 重要性はグラフ上で伝播するとすれば…
• 重要なノードに繋がるノードは重要
• 重要人物の友だちは重要人物?
• 媒介中心性
• 多くのノード同士の最短経路にいると重要
• その人がいないとみんなが困る?
31
Iron
man
Cap
Amer
Iron
man Hulk
Nick
Cap
Amer
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
演算型処理の実行
まず、各ノードの次数中心性を求めます
32
analyst.inDegreeCentrality(G)
計算されたスコアは各ノードの
プロパティ in_degree に格納されます
引数として、グラフ(G)が渡されています。計算量はノードの数 N、エッジ数
を E としたとき、計算量は N に依存して増加するため O (N) になります。詳細
はリファレンスに記載されています。
==> Vertex Property named 'in_degree' of type integer belonging to graph ..
Iron
man in_degree: 3
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
演算型処理の実行
5人の重要なキャラクターが得られました!
33
| n.id() | n.in_degree |
======================================
| CAPTAIN AMERICA | 1906 |
| SPIDER-MAN/PETER PAR | 1737 |
| IRON MAN/TONY STARK | 1522 |
| THING/BENJAMIN J. GR | 1416 |
| MR. FANTASTIC/REED R | 1379 |
G.queryPgql(" 
SELECT n.id(), n.in_degree WHERE (n) 
ORDER BY n.in_degree DESC 
").print(5)
計算結果を参照するためには、PGQLを使います
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
演算型処理の実行
次に、各ノードのページランクを求めます
34
analyst.pagerank(G, 0.0001, 0.85, 100)
計算されたスコアは各ノードの
プロパティ pagerank に格納されます
引数として、グラフ(G)および3つのパラメータ(許容される最大エラー値、ダ
ンピング・ファクター、計算の反復回数)が渡されています。計算量は反復回数
を k として O (k*E) になります。詳細はリファレンスに記載されています。
==> Vertex Property named 'pagerank' of type double belonging to graph ..
Ironman pagerank: 0.0041204
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
演算型処理の実行
スパイダーマンが1位になりました!
35
| n.id() | n.pagerank |
================================================
| SPIDER-MAN/PETER PAR | 0.005295697226042497 |
| CAPTAIN AMERICA | 0.005125996140362315 |
| IRON MAN/TONY STARK | 0.0041204415753377755 |
| WOLVERINE/LOGAN | 0.0038669573843525297 |
| THING/BENJAMIN J. GR | 0.00368240604720028 |
G.queryPgql(" 
SELECT n.id(), n.pagerank WHERE (n) 
ORDER BY n.pagerank DESC 
").print(5)
計算結果を参照するためには、PGQLを使います
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
演算型処理の実行
同様に、各ノードの媒介中心性も求めてみます
36
analyst.vertexBetweennessCentrality(G)
媒介中心性は、全ての頂点間の最短経路の中でその頂点が経路上にいる割合を
スコアとしています。媒介中心性の計算量は O (N*E) であり、ページランクの
計算量 O (k*E) と比較して計算コストが高く、やや実行時間が長くかかります。
詳細はリファレンスに記載されています。
==> Vertex Property named 'betweenness' of type double belonging to graph ..
計算されたスコアは各ノードの
プロパティ betweenness に格納されます Ironman pagerank: 0.0072942
betweenness: 1536742
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
演算型処理の実行
トップ4まではページランクとも順位が一致しています
37
| n.id() | n.betweenness |
=============================================
| SPIDER-MAN/PETER PAR | 3035278.742514685 |
| CAPTAIN AMERICA | 2351348.199987786 |
| IRON MAN/TONY STARK | 1536742.6554027207 |
| WOLVERINE/LOGAN | 1473595.2238889316 |
| HAVOK/ALEX SUMMERS | 1471842.538198293 |
G.queryPgql(" 
SELECT n.id(), n.betweenness WHERE (n) 
ORDER BY n.betweenness DESC 
").print(5)
計算結果を参照するためには、PGQLを使います
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
参照と演算の併用
38
演算型処理の結果(ここではページランクのスコア)を参照型処理(パターン・
マッチング)の対象としてそのまま使えてしまうのがPGQLの便利なところ!
前出の検索をこのように変更してみます。
「アイアンマンとスパイダーマンとウルヴァリンの全てと一緒に登場したこと
のあるキャラクターのうちマイナーなキャラクターは?」
Result = G.queryPgql(" 
SELECT x.id(), x.pagerank 
WHERE 
(x)--(a WITH id()='IRON MAN/TONY STARK ') 
, (x)--(b WITH id()='SPIDER-MAN/PETER PAR') 
, (x)--(c WITH id()='WOLVERINE/LOGAN ') 
ORDER BY x.pagerank ASC 
")
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
参照と演算の併用
39
こちらがマイナーなキャラクター10名です
Result.print(10)
| x.id() | x.pagerank |
================================================
| TYCHO | 5.611553899059807E-5 |
| ISBISA/DR. SANDERSON | 7.622033978468877E-5 |
| MASON, WANDA | 9.52103640547917E-5 |
| STORM, CHILI | 1.087940205195763E-4 |
| MAGNUM, MOSES | 1.0989429673080101E-4 |
| BIRD MAN/HENRY HAWK | 1.206812449804567E-4 |
| CAT MAN/HORGAN | 1.206812449804567E-4 |
| TERRAXIA | 1.2137478460591338E-4 |
| RAZORFIST III | 1.23495696066652E-4 |
| SVAROG | 1.2727748790164624E-4 |
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
タンパク質のネットワークであれば…
40
「タンパク質 A、B、C の全てと相互作用があるタンパク質のうちネットワーク
上の重要性が低いタンパク質(ロングテールの標的の可能性がある)は?」
Res = G.queryPgql(" 
SELECT x, x.pagerank 
WHERE 
(x)--(a WITH id()='Protein A') 
, (x)--(b WITH id()='Protein B') 
, (x)--(c WITH id()='Protein C') 
ORDER BY x.betweenness ASC 
")
A
X
CB
中心媒介性: 0.00129(低)
STRING Database http://string-db.org/
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 41
乗換案内
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
データの入手
42
駅データ.jp から、駅データ、接続駅データ、路線データを入手します。
line_cd,company_cd,line_name,line_name_k, ..
1001,3,中央新幹線,チュウオウシンカンセン, ..
1002,3,東海道新幹線,トウカイドウシンカンセン, ..
1003,4,山陽新幹線,サンヨウシンカンセン, ..
line_cd,station_cd1,station_cd2
1002,100201,100202
1002,100202,100203
1002,100203,100204
接続駅データはエッジです。
station_cd,station_g_cd,station_name, ..
1110101,1110101,函館, ..
1110102,1110102,五稜郭, ..
1110103,1110103,桔梗, ..
駅データはノードとそのプロパティです。
路線データはエッジのプロパティです。
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
データの加工
43
$ sort -t ',' -k 1 station20161107free.csv > station.csv
$ sort -t ',' -k 1 line20161107free.csv > line.csv
$ sort -t ',' -k 2 join20161107.csv > join01.csv
$ join -t ',' join01.csv station.csv -1 2 -2 1 -o 1.1,2.2,1.3 > join02.csv
$ sort -t ',' -k 3 join02.csv > join03.csv
$ join -t ',' join03.csv station.csv -1 3 -2 1 -o 1.1,1.2,2.2 > join04.csv
$ sort -t ',' -k 1 join04.csv > join05.csv
$ join -t ',' join05.csv line.csv -1 1 -2 1 -o 2.3,1.2,1.3 > join06.csv
$ cat station.csv | awk -v FS=',' -v OFS=',' '{if (NR != 1) print $2, "*"}' | 
sort | uniq > station_uniq.csv
$ join -t ',' station_uniq.csv station.csv -1 1 -2 1 -o 1.1,1.2,2.3 > rail.csv
$ cat join06.csv | 
awk -v FS=',' -v OFS=',' '{print $2, $3, $1, "1"}' >> rail.csv
データを Edge List 形式に加工します。
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフのロード
44
$ vi rail.csv.json
{
"uri": "rail.csv"
, "format": "edge_list"
, "node_id_type": "integer"
, "vertex_props":[
{"name":"name", "type":"string"}
]
, "edge_props":[
{"name":"name", "type":"string"}
, {"name":"score", "type":"double"}
]
, "separator": ","
}
グラフのロードのための情報をJSONで記述します
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
グラフのロード
45
PGXシェルを開き、グラフを(有向グラフのまま)ロードします
G = session.readGraphWithProperties("rail/rail.csv.json")
同じ駅間は複数の路線で接続されていることがあるため、
このグラフは同じノード間に複数のエッジが含まれ得るグラフです
G.queryPgql(" 
SELECT x.name, y.name, r.name WHERE (x)-[r]-(y), 
x.name='恵比寿', y.name='渋谷' 
").getResults()
==> x.name(STRING)=恵比寿 y.name(STRING)=渋谷 r.name(STRING)=JR湘南新宿ライン
==> x.name(STRING)=恵比寿 y.name(STRING)=渋谷 r.name(STRING)=JR埼京線
==> x.name(STRING)=恵比寿 y.name(STRING)=渋谷 r.name(STRING)=JR山手線
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
有向グラフと無効グラフ
46
G.queryPgql(" 
SELECT x.name, r.name, y.name WHERE (x)-[r]->(y), x.name='外苑前' 
").getResults()
外苑前のとなりの駅と路線
==> x.name(STRING)=外苑前 r.name(STRING)=東京メトロ銀座線 y.name(STRING)=表参道
G.queryPgql(" 
SELECT x.name, r.name, y.name WHERE (x)<-[r]-(y), x.name='外苑前' 
").getResults()
==> x.name(STRING)=外苑前 r.name(STRING)=東京メトロ銀座線 y.name(STRING)=青山一丁目
逆方向の駅
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
有向グラフと無効グラフ
47
G.queryPgql(" 
SELECT x.name, r.name, y.name WHERE (x)-[r]-(y), x.name='外苑前' 
").getResults()
==> x.name(STRING)=外苑前 r.name(STRING)=東京メトロ銀座線 y.name(STRING)=青山一丁目
==> x.name(STRING)=外苑前 r.name(STRING)=東京メトロ銀座線 y.name(STRING)=表参道
無効グラフにすることにより、同じ路線の逆方向の駅が出力されます
実際には多くの路線は両方向なので、無効グラフに変換します
G = G.undirect()
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
経路の検索
48
G.queryPgql(" 
SELECT y.name, COUNT(*) AS cnt WHERE (x)--()--()--(y), 
x.name='外苑前' GROUP BY y.name ORDER BY cnt DESC 
").getResults()
外苑前から3ホップの駅とその経路の数を求めます
==> y.name(STRING)=青山一丁目 cnt(LONG)=9
==> y.name(STRING)=表参道 cnt(LONG)=9
==> y.name(STRING)=恵比寿 cnt(LONG)=6
==> y.name(STRING)=新宿 cnt(LONG)=6
==> y.name(STRING)=原宿 cnt(LONG)=5
==> y.name(STRING)=渋谷 cnt(LONG)=4
==> y.name(STRING)=溜池山王 cnt(LONG)=4
...
同じ駅を行き来することができるため隣の駅への経路が多く出力されます
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
経路の検索
49
G.queryPgql(" 
SELECT y.name, COUNT(*) AS cnt WHERE (x)--(s1)--(s2)--(y), 
x.name='外苑前', x!=s1, x!=s2, x!=y, s1!=s2, s1!=y, s2!=y 
GROUP BY y.name ORDER BY cnt DESC 
").getResults()
同じ駅を2度通らないように条件を追加します
==> y.name(STRING)=恵比寿 cnt(LONG)=6
==> y.name(STRING)=新宿 cnt(LONG)=6
==> y.name(STRING)=原宿 cnt(LONG)=5
==> y.name(STRING)=四ツ谷 cnt(LONG)=4
==> y.name(STRING)=渋谷 cnt(LONG)=4
==> y.name(STRING)=溜池山王 cnt(LONG)=4
==> y.name(STRING)=桜田門 cnt(LONG)=2
==> y.name(STRING)=半蔵門 cnt(LONG)=2
...
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
経路の検索
50
G.queryPgql(" 
SELECT r1.name, r2.name, r3.name 
WHERE (x)-[r1]-(s1)-[r2]-(s2)-[r3]-(y), 
x.name='外苑前', y.name='新宿', x!=s1, x!=s2, x!=y, s1!=s2, s1!=y, s2!=y 
").getResults()
経路を確認します
==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ半蔵門線 r3.name(STRING)=JR湘南新宿ライン
==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ半蔵門線 r3.name(STRING)=JR成田エクスプレス
==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ銀座線 r3.name(STRING)=JR湘南新宿ライン
==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ銀座線 r3.name(STRING)=JR成田エクスプレス
==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ半蔵門線 r3.name(STRING)=JR埼京線
==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ銀座線 r3.name(STRING)=JR埼京線
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
重要度の高い駅は?
各駅の次数中心性、ページランク、媒介中心性も求めてみます。
同じ駅間に複数の路線があった場合にもひとつのエッジとして計算できるように
グラフを変換します。複数の路線のうちひとつのみを残して他は削除されます。
51
analyst.inDegreeCentrality(G)
analyst.pagerank(G, 0.0001, 0.85, 100)
analyst.vertexBetweennessCentrality(G)
G = G.simplify( 
MultiEdges.REMOVE_MULTI_EDGES 
, SelfEdges.REMOVE_SELF_EDGES 
, TrivialVertices.REMOVE_TRIVIAL_VERTICES 
, Mode.CREATE_COPY 
, null 
)
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
重要度の高い駅は?
52
G.queryPgql(" 
SELECT n.name, n.in_degree 
WHERE (n) ORDER BY n.in_degree DESC 
").getResults()
次数中心性の高い駅を参照します
==> n.name(STRING)=横浜 n.in_degree(INTEGER)=14
==> n.name(STRING)=新宿 n.in_degree(INTEGER)=13
==> n.name(STRING)=池袋 n.in_degree(INTEGER)=13
==> n.name(STRING)=大阪 n.in_degree(INTEGER)=12
==> n.name(STRING)=千葉 n.in_degree(INTEGER)=11
==> n.name(STRING)=名古屋 n.in_degree(INTEGER)=11
==> n.name(STRING)=東京 n.in_degree(INTEGER)=11
==> n.name(STRING)=品川 n.in_degree(INTEGER)=11
==> n.name(STRING)=大宮 n.in_degree(INTEGER)=9
==> n.name(STRING)=金山 n.in_degree(INTEGER)=9
※ 出典 (ライセンス: CC BY-SA 4.0) https://ja.wikipedia.org/wiki/新宿駅#/media/File:JR_Shinjuku_Miraina_TowerB.JPG
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
重要度の高い駅は?
53
G.queryPgql(" 
SELECT n.name, n.pagerank 
WHERE (n) ORDER BY n.pagerank DESC 
").getResults()
ページランクの高い駅を参照します
※ 出典 (ライセンス: CC BY 3.0) https://ja.wikipedia.org/wiki/横浜駅#/media/File:横浜駅西口方駅舎.jpg
==> n.name(STRING)=横浜 n.pagerank(DOUBLE)=4.9..
==> n.name(STRING)=池袋 n.pagerank(DOUBLE)=4.5..
==> n.name(STRING)=新宿 n.pagerank(DOUBLE)=4.2..
==> n.name(STRING)=名古屋 n.pagerank(DOUBLE)=4.0..
==> n.name(STRING)=千葉 n.pagerank(DOUBLE)=4.0..
==> n.name(STRING)=大阪 n.pagerank(DOUBLE)=3.8..
==> n.name(STRING)=三ノ宮 n.pagerank(DOUBLE)=3.6..
==> n.name(STRING)=大宮 n.pagerank(DOUBLE)=3.4..
==> n.name(STRING)=金山 n.pagerank(DOUBLE)=3.3..
==> n.name(STRING)=品川 n.pagerank(DOUBLE)=3.3..
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
重要度の高い駅は?
54
G.queryPgql(" 
SELECT n.name, n.betweenness 
WHERE (n) ORDER BY n.betweenness DESC 
").getResults()
媒介中心性の高い駅を参照します
※ 出典 (ライセンス: GFDL) https://ja.wikipedia.org/wiki/塩尻駅#/media/File:ShiojiriStnishi.jpg
==> n.name(STRING)=塩尻 n.betweenness(..)=3.5..
==> n.name(STRING)=恵那 n.betweenness(..)=3.4..
==> n.name(STRING)=多治見 n.betweenness(..)=3.4..
==> n.name(STRING)=土岐市 n.betweenness(..)=3.4..
==> n.name(STRING)=瑞浪 n.betweenness(..)=3.4..
==> n.name(STRING)=釜戸 n.betweenness(..)=3.4..
==> n.name(STRING)=武並 n.betweenness(..)=3.4..
==> n.name(STRING)=美乃坂本 n.betweenness(..)=3.4..
==> n.name(STRING)=中津川 n.betweenness(..)=3.4..
==> n.name(STRING)=落合川 n.betweenness(..)=3.4..
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
重要度の高い駅は?
55
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
連結している?
56
G.queryPgql(" 
SELECT x.wcc, COUNT(*) AS num_station WHERE (x) 
GROUP BY x.wcc ORDER BY num_station DESC 
").print()
出発と到着の駅のノードIDを確認しておきます
連結成分を計算します(WCC: Weakly Connected Compornent)
analyst.wcc(G)
| x.wcc | num_station |
+---------------------+
| 1 | 8915 |
| 0 | 15 |
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
連結している?
57
分割された小さいほうのグラフに含まれる駅を表示します
G.queryPgql(" 
SELECT r.name, x.name, y.name WHERE (x)-[r]-(y), x.wcc=0, y.wcc=0 
").getResults()
==> r.name(STRING)=ゆいレール x.name(STRING)=那覇空港 y.name(STRING)=赤嶺
==> r.name(STRING)=ゆいレール x.name(STRING)=赤嶺 y.name(STRING)=那覇空港
==> r.name(STRING)=ゆいレール x.name(STRING)=赤嶺 y.name(STRING)=小禄
==> r.name(STRING)=ゆいレール x.name(STRING)=小禄 y.name(STRING)=赤嶺
==> r.name(STRING)=ゆいレール x.name(STRING)=小禄 y.name(STRING)=奥武山公園
==> r.name(STRING)=ゆいレール x.name(STRING)=奥武山公園 y.name(STRING)=小禄
==> r.name(STRING)=ゆいレール x.name(STRING)=奥武山公園 y.name(STRING)=壺川
==> r.name(STRING)=ゆいレール x.name(STRING)=壺川 y.name(STRING)=奥武山公園
==> r.name(STRING)=ゆいレール x.name(STRING)=壺川 y.name(STRING)=旭橋
==> r.name(STRING)=ゆいレール x.name(STRING)=旭橋 y.name(STRING)=壺川
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
最短経路は?
58
G.queryPgql(" SELECT x.id() WHERE (x), x.name='外苑前' ").print()
G.queryPgql(" SELECT x.id() WHERE (x), x.name='名古屋' ").print()
出発と到着の駅のノードIDを確認しておきます
| x.id() |
+---------+
| 2800117 |
| x.id() |
+---------+
| 1190412 |
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
最短経路は?
59
Path.getPathLengthWithHop()
最短で何ホップで到達できるかがわかります。
==> 360
エッジのスコア(今回は距離や時間のデータがないため全て 1 としています)を
指定してダイクストラ法で最短経路を計算します。計算量は O (N log(N)) です。
node1 = G.getVertex(2800117)
node2 = G.getVertex(1190412)
score = G.getEdgeProperty("score")
Path = analyst.shortestPathDijkstra(G, node1, node2, score)
Path.exists()
==> true
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
最短経路は?
60
最短経路上の駅を確認します。ただし、このデータには新幹線など一部のデータ
が含まれていないことにご留意ください。
vList = Path.getVertices()
eList = Path.getEdges()
hops = Path.getPathLengthWithHop()
for (i=0; i<hops+1; i++) {
print vList[i].getProperty("name")
if (i==hops) {
print "n"
} else {
print " > "
}
}
外苑前 > 表参道 > 渋谷 > 新宿 > 吉祥寺 > 三鷹 > 国分寺 > 立川 > 八王子 > 高尾 > 相模湖 >
藤野 > 上野原 > 四方津 > (略) > 加治木 >錦江 > 帖佐 > 姶良 > 重富 > 竜ケ水 > 鹿児島
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 61
PGX.D
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
PGX.D ― 分散処理版 PGX
62
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
PGX.D ― HPC の SC15 で Best Paper のひとつに
63
http://sc15.supercomputing.org/conference-program/technical-program/papers/best-student-paper-and-paper-finalists
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 64
参考資料
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.
参考資料
• Oracle Labs PGX(再掲)
• 関連する Oracle 製品
• Oracle Database Spatial and Graph
• Oracle Big Data Spatial and Graph
• 関連する SlideShare 資料
• Hadoop Conference Japan 2016 LT資料 グラフデータベース事始め
• オラクルのHadoopソリューションご紹介
65
Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.

Weitere ähnliche Inhalte

Was ist angesagt?

エンジニアチームにとって手の届くKPIを考えて、仕事に取り入れてみた supported by アトラクタ原田騎郎さん
エンジニアチームにとって手の届くKPIを考えて、仕事に取り入れてみた supported by アトラクタ原田騎郎さんエンジニアチームにとって手の届くKPIを考えて、仕事に取り入れてみた supported by アトラクタ原田騎郎さん
エンジニアチームにとって手の届くKPIを考えて、仕事に取り入れてみた supported by アトラクタ原田騎郎さんRakuten Group, Inc.
 
甘酸っぱいGCPレガシーApp Engine python2からCloud Runへの移行の勘所
甘酸っぱいGCPレガシーApp Engine python2からCloud Runへの移行の勘所甘酸っぱいGCPレガシーApp Engine python2からCloud Runへの移行の勘所
甘酸っぱいGCPレガシーApp Engine python2からCloud Runへの移行の勘所Ryusuke Kimura
 
Ganglia のUIにGrafanaを追加する話
Ganglia のUIにGrafanaを追加する話Ganglia のUIにGrafanaを追加する話
Ganglia のUIにGrafanaを追加する話KLab Inc. / Tech
 
Flumeを活用したAmebaにおける大規模ログ収集システム
Flumeを活用したAmebaにおける大規模ログ収集システムFlumeを活用したAmebaにおける大規模ログ収集システム
Flumeを活用したAmebaにおける大規模ログ収集システムSatoshi Iijima
 
20191009 AWS Black Belt Online Seminar Amazon GameLift
20191009 AWS Black Belt Online Seminar Amazon GameLift20191009 AWS Black Belt Online Seminar Amazon GameLift
20191009 AWS Black Belt Online Seminar Amazon GameLiftAmazon Web Services Japan
 
アプリケーション開発者のためのAzure Databricks入門
アプリケーション開発者のためのAzure Databricks入門アプリケーション開発者のためのAzure Databricks入門
アプリケーション開発者のためのAzure Databricks入門Yoichi Kawasaki
 
202204 AWS Black Belt Online Seminar AWS IoT Device Defender
202204 AWS Black Belt Online Seminar AWS IoT Device Defender202204 AWS Black Belt Online Seminar AWS IoT Device Defender
202204 AWS Black Belt Online Seminar AWS IoT Device DefenderAmazon Web Services Japan
 
Oracle Cloud Infrastructure:2021年12月度サービス・アップデート
Oracle Cloud Infrastructure:2021年12月度サービス・アップデートOracle Cloud Infrastructure:2021年12月度サービス・アップデート
Oracle Cloud Infrastructure:2021年12月度サービス・アップデートオラクルエンジニア通信
 
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...Google Cloud Platform - Japan
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j昌桓 李
 
AWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザAWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザNoritaka Sekiyama
 
データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介Amazon Web Services Japan
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ増田 亨
 
【istyle Data Talk #01】失敗から学ぶ!@cosmeを変えるデータ基盤のめざしどころ
【istyle Data Talk #01】失敗から学ぶ!@cosmeを変えるデータ基盤のめざしどころ【istyle Data Talk #01】失敗から学ぶ!@cosmeを変えるデータ基盤のめざしどころ
【istyle Data Talk #01】失敗から学ぶ!@cosmeを変えるデータ基盤のめざしどころHitomi Kakizaki
 
Oracleからamazon auroraへの移行にむけて
Oracleからamazon auroraへの移行にむけてOracleからamazon auroraへの移行にむけて
Oracleからamazon auroraへの移行にむけてYoichi Sai
 
事例から見る規模別クラウド・データベースの選び方 (Oracle Database) (Oracle Cloudウェビナーシリーズ: 2021年6月30日)
事例から見る規模別クラウド・データベースの選び方 (Oracle Database) (Oracle Cloudウェビナーシリーズ: 2021年6月30日)事例から見る規模別クラウド・データベースの選び方 (Oracle Database) (Oracle Cloudウェビナーシリーズ: 2021年6月30日)
事例から見る規模別クラウド・データベースの選び方 (Oracle Database) (Oracle Cloudウェビナーシリーズ: 2021年6月30日)オラクルエンジニア通信
 
FIWARE Big Data Ecosystem : Cygnus and STH Comet
FIWARE Big Data Ecosystem : Cygnus and STH CometFIWARE Big Data Ecosystem : Cygnus and STH Comet
FIWARE Big Data Ecosystem : Cygnus and STH Cometfisuda
 

Was ist angesagt? (20)

エンジニアチームにとって手の届くKPIを考えて、仕事に取り入れてみた supported by アトラクタ原田騎郎さん
エンジニアチームにとって手の届くKPIを考えて、仕事に取り入れてみた supported by アトラクタ原田騎郎さんエンジニアチームにとって手の届くKPIを考えて、仕事に取り入れてみた supported by アトラクタ原田騎郎さん
エンジニアチームにとって手の届くKPIを考えて、仕事に取り入れてみた supported by アトラクタ原田騎郎さん
 
甘酸っぱいGCPレガシーApp Engine python2からCloud Runへの移行の勘所
甘酸っぱいGCPレガシーApp Engine python2からCloud Runへの移行の勘所甘酸っぱいGCPレガシーApp Engine python2からCloud Runへの移行の勘所
甘酸っぱいGCPレガシーApp Engine python2からCloud Runへの移行の勘所
 
Ganglia のUIにGrafanaを追加する話
Ganglia のUIにGrafanaを追加する話Ganglia のUIにGrafanaを追加する話
Ganglia のUIにGrafanaを追加する話
 
Flumeを活用したAmebaにおける大規模ログ収集システム
Flumeを活用したAmebaにおける大規模ログ収集システムFlumeを活用したAmebaにおける大規模ログ収集システム
Flumeを活用したAmebaにおける大規模ログ収集システム
 
20191009 AWS Black Belt Online Seminar Amazon GameLift
20191009 AWS Black Belt Online Seminar Amazon GameLift20191009 AWS Black Belt Online Seminar Amazon GameLift
20191009 AWS Black Belt Online Seminar Amazon GameLift
 
アプリケーション開発者のためのAzure Databricks入門
アプリケーション開発者のためのAzure Databricks入門アプリケーション開発者のためのAzure Databricks入門
アプリケーション開発者のためのAzure Databricks入門
 
202204 AWS Black Belt Online Seminar AWS IoT Device Defender
202204 AWS Black Belt Online Seminar AWS IoT Device Defender202204 AWS Black Belt Online Seminar AWS IoT Device Defender
202204 AWS Black Belt Online Seminar AWS IoT Device Defender
 
Oracle Cloud Infrastructure:2021年12月度サービス・アップデート
Oracle Cloud Infrastructure:2021年12月度サービス・アップデートOracle Cloud Infrastructure:2021年12月度サービス・アップデート
Oracle Cloud Infrastructure:2021年12月度サービス・アップデート
 
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
アプリ開発者、DB 管理者視点での Cloud Spanner 活用方法 | 第 10 回 Google Cloud INSIDE Games & App...
 
異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j異次元のグラフデータベースNeo4j
異次元のグラフデータベースNeo4j
 
AWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザAWS で Presto を徹底的に使いこなすワザ
AWS で Presto を徹底的に使いこなすワザ
 
Helidon 概要
Helidon 概要Helidon 概要
Helidon 概要
 
データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介データ活用を加速するAWS分析サービスのご紹介
データ活用を加速するAWS分析サービスのご紹介
 
マイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチマイクロサービス 4つの分割アプローチ
マイクロサービス 4つの分割アプローチ
 
【istyle Data Talk #01】失敗から学ぶ!@cosmeを変えるデータ基盤のめざしどころ
【istyle Data Talk #01】失敗から学ぶ!@cosmeを変えるデータ基盤のめざしどころ【istyle Data Talk #01】失敗から学ぶ!@cosmeを変えるデータ基盤のめざしどころ
【istyle Data Talk #01】失敗から学ぶ!@cosmeを変えるデータ基盤のめざしどころ
 
NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例NetflixにおけるPresto/Spark活用事例
NetflixにおけるPresto/Spark活用事例
 
Oracleからamazon auroraへの移行にむけて
Oracleからamazon auroraへの移行にむけてOracleからamazon auroraへの移行にむけて
Oracleからamazon auroraへの移行にむけて
 
事例から見る規模別クラウド・データベースの選び方 (Oracle Database) (Oracle Cloudウェビナーシリーズ: 2021年6月30日)
事例から見る規模別クラウド・データベースの選び方 (Oracle Database) (Oracle Cloudウェビナーシリーズ: 2021年6月30日)事例から見る規模別クラウド・データベースの選び方 (Oracle Database) (Oracle Cloudウェビナーシリーズ: 2021年6月30日)
事例から見る規模別クラウド・データベースの選び方 (Oracle Database) (Oracle Cloudウェビナーシリーズ: 2021年6月30日)
 
FIWARE Big Data Ecosystem : Cygnus and STH Comet
FIWARE Big Data Ecosystem : Cygnus and STH CometFIWARE Big Data Ecosystem : Cygnus and STH Comet
FIWARE Big Data Ecosystem : Cygnus and STH Comet
 
GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)GraphQL入門 (AWS AppSync)
GraphQL入門 (AWS AppSync)
 

Ähnlich wie Oracle Labs 発! Parallel Graph AnalytiX(PGX)

20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章Insight Technology, Inc.
 
Rでpgxを使う
Rでpgxを使うRでpgxを使う
Rでpgxを使うMio Takei
 
Oracle Cloud Platform - クラクドにおける 新たなデータベース開発
Oracle Cloud Platform - クラクドにおける新たなデータベース開発Oracle Cloud Platform - クラクドにおける新たなデータベース開発
Oracle Cloud Platform - クラクドにおける 新たなデータベース開発オラクルエンジニア通信
 
Oracle Data Minerハンズオンセミナー170927:①Oracle 機械学習概要
Oracle Data Minerハンズオンセミナー170927:①Oracle 機械学習概要Oracle Data Minerハンズオンセミナー170927:①Oracle 機械学習概要
Oracle Data Minerハンズオンセミナー170927:①Oracle 機械学習概要オラクルエンジニア通信
 
クラウドから始めるRのビッグデータ分析- Oracle R Enterprise in Cloud
クラウドから始めるRのビッグデータ分析- Oracle R Enterprise in Cloudクラウドから始めるRのビッグデータ分析- Oracle R Enterprise in Cloud
クラウドから始めるRのビッグデータ分析- Oracle R Enterprise in Cloud幹雄 小川
 
MySQLの公式GUIツール MySQL Workbench
MySQLの公式GUIツール MySQL WorkbenchMySQLの公式GUIツール MySQL Workbench
MySQLの公式GUIツール MySQL Workbenchyoyamasaki
 
GraphQLはどんな時に使うか
GraphQLはどんな時に使うかGraphQLはどんな時に使うか
GraphQLはどんな時に使うかYutaka Tachibana
 
20170714_MySQL 5.7 GIS(地理情報システム) by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQL 5.7 GIS(地理情報システム) by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQL 5.7 GIS(地理情報システム) by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQL 5.7 GIS(地理情報システム) by 日本オラクル株式会社 MySQL GBU 山﨑由章Insight Technology, Inc.
 
成功事例に学べ! これからの時代のビッグデータ活用最新ベストプラクティス [Oracle Cloud Days Tokyo 2016]
成功事例に学べ! これからの時代のビッグデータ活用最新ベストプラクティス [Oracle Cloud Days Tokyo 2016]成功事例に学べ! これからの時代のビッグデータ活用最新ベストプラクティス [Oracle Cloud Days Tokyo 2016]
成功事例に学べ! これからの時代のビッグデータ活用最新ベストプラクティス [Oracle Cloud Days Tokyo 2016]オラクルエンジニア通信
 
MySQL最新情報
MySQL最新情報MySQL最新情報
MySQL最新情報yoyamasaki
 
Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7Shinya Sugiyama
 
MySQLドキュメントストアとCTE
MySQLドキュメントストアとCTEMySQLドキュメントストアとCTE
MySQLドキュメントストアとCTEyoyamasaki
 
Oracle Cloud PaaS & IaaS:2018年12月度サービス情報アップデート
Oracle Cloud PaaS & IaaS:2018年12月度サービス情報アップデートOracle Cloud PaaS & IaaS:2018年12月度サービス情報アップデート
Oracle Cloud PaaS & IaaS:2018年12月度サービス情報アップデートオラクルエンジニア通信
 
Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)
Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)
Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)オラクルエンジニア通信
 
SPARQLアプリケーション開発
SPARQLアプリケーション開発SPARQLアプリケーション開発
SPARQLアプリケーション開発Toshiaki Katayama
 
オラクルGo! 位置情報アプリをクラウドで簡単に作ってみた
オラクルGo! 位置情報アプリをクラウドで簡単に作ってみたオラクルGo! 位置情報アプリをクラウドで簡単に作ってみた
オラクルGo! 位置情報アプリをクラウドで簡単に作ってみたYosuke Arai
 
分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise GraphYuki Morishita
 

Ähnlich wie Oracle Labs 発! Parallel Graph AnalytiX(PGX) (20)

20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQLドキュメントストア JSONデータ型&JSON関数 by 日本オラクル株式会社 MySQL GBU 山﨑由章
 
Rでpgxを使う
Rでpgxを使うRでpgxを使う
Rでpgxを使う
 
Oracle Cloud Platform - クラクドにおける 新たなデータベース開発
Oracle Cloud Platform - クラクドにおける新たなデータベース開発Oracle Cloud Platform - クラクドにおける新たなデータベース開発
Oracle Cloud Platform - クラクドにおける 新たなデータベース開発
 
超高速な機械学習を Oracle Database で実現!
超高速な機械学習を Oracle Database で実現!超高速な機械学習を Oracle Database で実現!
超高速な機械学習を Oracle Database で実現!
 
Oracle Data Minerハンズオンセミナー170927:①Oracle 機械学習概要
Oracle Data Minerハンズオンセミナー170927:①Oracle 機械学習概要Oracle Data Minerハンズオンセミナー170927:①Oracle 機械学習概要
Oracle Data Minerハンズオンセミナー170927:①Oracle 機械学習概要
 
クラウドから始めるRのビッグデータ分析- Oracle R Enterprise in Cloud
クラウドから始めるRのビッグデータ分析- Oracle R Enterprise in Cloudクラウドから始めるRのビッグデータ分析- Oracle R Enterprise in Cloud
クラウドから始めるRのビッグデータ分析- Oracle R Enterprise in Cloud
 
MySQLの公式GUIツール MySQL Workbench
MySQLの公式GUIツール MySQL WorkbenchMySQLの公式GUIツール MySQL Workbench
MySQLの公式GUIツール MySQL Workbench
 
GraphQLはどんな時に使うか
GraphQLはどんな時に使うかGraphQLはどんな時に使うか
GraphQLはどんな時に使うか
 
20170714_MySQL 5.7 GIS(地理情報システム) by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQL 5.7 GIS(地理情報システム) by 日本オラクル株式会社 MySQL GBU 山﨑由章20170714_MySQL 5.7 GIS(地理情報システム) by 日本オラクル株式会社 MySQL GBU 山﨑由章
20170714_MySQL 5.7 GIS(地理情報システム) by 日本オラクル株式会社 MySQL GBU 山﨑由章
 
成功事例に学べ! これからの時代のビッグデータ活用最新ベストプラクティス [Oracle Cloud Days Tokyo 2016]
成功事例に学べ! これからの時代のビッグデータ活用最新ベストプラクティス [Oracle Cloud Days Tokyo 2016]成功事例に学べ! これからの時代のビッグデータ活用最新ベストプラクティス [Oracle Cloud Days Tokyo 2016]
成功事例に学べ! これからの時代のビッグデータ活用最新ベストプラクティス [Oracle Cloud Days Tokyo 2016]
 
MySQL最新情報
MySQL最新情報MySQL最新情報
MySQL最新情報
 
Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7Power of SQL and NoSQL with MySQL5.7
Power of SQL and NoSQL with MySQL5.7
 
Oracle R Advanced Analytics for Hadoop利用方法
Oracle R Advanced Analytics for Hadoop利用方法Oracle R Advanced Analytics for Hadoop利用方法
Oracle R Advanced Analytics for Hadoop利用方法
 
MySQLドキュメントストアとCTE
MySQLドキュメントストアとCTEMySQLドキュメントストアとCTE
MySQLドキュメントストアとCTE
 
Oracle Advanced Analytics 概要
Oracle Advanced Analytics 概要Oracle Advanced Analytics 概要
Oracle Advanced Analytics 概要
 
Oracle Cloud PaaS & IaaS:2018年12月度サービス情報アップデート
Oracle Cloud PaaS & IaaS:2018年12月度サービス情報アップデートOracle Cloud PaaS & IaaS:2018年12月度サービス情報アップデート
Oracle Cloud PaaS & IaaS:2018年12月度サービス情報アップデート
 
Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)
Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)
Oracle Cloudで始める、DBエンジニアのためのHadoop超入門(db tech showcase 2016 Oracle セッション資料)
 
SPARQLアプリケーション開発
SPARQLアプリケーション開発SPARQLアプリケーション開発
SPARQLアプリケーション開発
 
オラクルGo! 位置情報アプリをクラウドで簡単に作ってみた
オラクルGo! 位置情報アプリをクラウドで簡単に作ってみたオラクルGo! 位置情報アプリをクラウドで簡単に作ってみた
オラクルGo! 位置情報アプリをクラウドで簡単に作ってみた
 
分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph分散グラフデータベース DataStax Enterprise Graph
分散グラフデータベース DataStax Enterprise Graph
 

Mehr von オラクルエンジニア通信

Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
Oracle Cloud Infrastructure:2023年5月度サービス・アップデートOracle Cloud Infrastructure:2023年5月度サービス・アップデート
Oracle Cloud Infrastructure:2023年5月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2023年4月度サービス・アップデート
Oracle Cloud Infrastructure:2023年4月度サービス・アップデートOracle Cloud Infrastructure:2023年4月度サービス・アップデート
Oracle Cloud Infrastructure:2023年4月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2023年3月度サービス・アップデート
Oracle Cloud Infrastructure:2023年3月度サービス・アップデートOracle Cloud Infrastructure:2023年3月度サービス・アップデート
Oracle Cloud Infrastructure:2023年3月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2023年2月度サービス・アップデート
Oracle Cloud Infrastructure:2023年2月度サービス・アップデートOracle Cloud Infrastructure:2023年2月度サービス・アップデート
Oracle Cloud Infrastructure:2023年2月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2023年1月度サービス・アップデート
Oracle Cloud Infrastructure:2023年1月度サービス・アップデートOracle Cloud Infrastructure:2023年1月度サービス・アップデート
Oracle Cloud Infrastructure:2023年1月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年12月度サービス・アップデート
Oracle Cloud Infrastructure:2022年12月度サービス・アップデートOracle Cloud Infrastructure:2022年12月度サービス・アップデート
Oracle Cloud Infrastructure:2022年12月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年11月度サービス・アップデート
Oracle Cloud Infrastructure:2022年11月度サービス・アップデートOracle Cloud Infrastructure:2022年11月度サービス・アップデート
Oracle Cloud Infrastructure:2022年11月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年10月度サービス・アップデート
Oracle Cloud Infrastructure:2022年10月度サービス・アップデートOracle Cloud Infrastructure:2022年10月度サービス・アップデート
Oracle Cloud Infrastructure:2022年10月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年9月度サービス・アップデート
Oracle Cloud Infrastructure:2022年9月度サービス・アップデートOracle Cloud Infrastructure:2022年9月度サービス・アップデート
Oracle Cloud Infrastructure:2022年9月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年8月度サービス・アップデート
Oracle Cloud Infrastructure:2022年8月度サービス・アップデートOracle Cloud Infrastructure:2022年8月度サービス・アップデート
Oracle Cloud Infrastructure:2022年8月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年7月度サービス・アップデート
Oracle Cloud Infrastructure:2022年7月度サービス・アップデートOracle Cloud Infrastructure:2022年7月度サービス・アップデート
Oracle Cloud Infrastructure:2022年7月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年6月度サービス・アップデート
Oracle Cloud Infrastructure:2022年6月度サービス・アップデートOracle Cloud Infrastructure:2022年6月度サービス・アップデート
Oracle Cloud Infrastructure:2022年6月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年5月度サービス・アップデート
Oracle Cloud Infrastructure:2022年5月度サービス・アップデートOracle Cloud Infrastructure:2022年5月度サービス・アップデート
Oracle Cloud Infrastructure:2022年5月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年4月度サービス・アップデート
Oracle Cloud Infrastructure:2022年4月度サービス・アップデートOracle Cloud Infrastructure:2022年4月度サービス・アップデート
Oracle Cloud Infrastructure:2022年4月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure データベース・クラウド:各バージョンのサポート期間 (2022年4月版)
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間 (2022年4月版)Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間 (2022年4月版)
Oracle Cloud Infrastructure データベース・クラウド:各バージョンのサポート期間 (2022年4月版)オラクルエンジニア通信
 
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会オラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年3月度サービス・アップデート
Oracle Cloud Infrastructure:2022年3月度サービス・アップデートOracle Cloud Infrastructure:2022年3月度サービス・アップデート
Oracle Cloud Infrastructure:2022年3月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年2月度サービス・アップデート
Oracle Cloud Infrastructure:2022年2月度サービス・アップデートOracle Cloud Infrastructure:2022年2月度サービス・アップデート
Oracle Cloud Infrastructure:2022年2月度サービス・アップデートオラクルエンジニア通信
 
Oracle Cloud Infrastructure:2022年1月度サービス・アップデート
Oracle Cloud Infrastructure:2022年1月度サービス・アップデートOracle Cloud Infrastructure:2022年1月度サービス・アップデート
Oracle Cloud Infrastructure:2022年1月度サービス・アップデートオラクルエンジニア通信
 
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)オラクルエンジニア通信
 

Mehr von オラクルエンジニア通信 (20)

Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
Oracle Cloud Infrastructure:2023年5月度サービス・アップデートOracle Cloud Infrastructure:2023年5月度サービス・アップデート
Oracle Cloud Infrastructure:2023年5月度サービス・アップデート
 
Oracle Cloud Infrastructure:2023年4月度サービス・アップデート
Oracle Cloud Infrastructure:2023年4月度サービス・アップデートOracle Cloud Infrastructure:2023年4月度サービス・アップデート
Oracle Cloud Infrastructure:2023年4月度サービス・アップデート
 
Oracle Cloud Infrastructure:2023年3月度サービス・アップデート
Oracle Cloud Infrastructure:2023年3月度サービス・アップデートOracle Cloud Infrastructure:2023年3月度サービス・アップデート
Oracle Cloud Infrastructure:2023年3月度サービス・アップデート
 
Oracle Cloud Infrastructure:2023年2月度サービス・アップデート
Oracle Cloud Infrastructure:2023年2月度サービス・アップデートOracle Cloud Infrastructure:2023年2月度サービス・アップデート
Oracle Cloud Infrastructure:2023年2月度サービス・アップデート
 
Oracle Cloud Infrastructure:2023年1月度サービス・アップデート
Oracle Cloud Infrastructure:2023年1月度サービス・アップデートOracle Cloud Infrastructure:2023年1月度サービス・アップデート
Oracle Cloud Infrastructure:2023年1月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年12月度サービス・アップデート
Oracle Cloud Infrastructure:2022年12月度サービス・アップデートOracle Cloud Infrastructure:2022年12月度サービス・アップデート
Oracle Cloud Infrastructure:2022年12月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年11月度サービス・アップデート
Oracle Cloud Infrastructure:2022年11月度サービス・アップデートOracle Cloud Infrastructure:2022年11月度サービス・アップデート
Oracle Cloud Infrastructure:2022年11月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年10月度サービス・アップデート
Oracle Cloud Infrastructure:2022年10月度サービス・アップデートOracle Cloud Infrastructure:2022年10月度サービス・アップデート
Oracle Cloud Infrastructure:2022年10月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年9月度サービス・アップデート
Oracle Cloud Infrastructure:2022年9月度サービス・アップデートOracle Cloud Infrastructure:2022年9月度サービス・アップデート
Oracle Cloud Infrastructure:2022年9月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年8月度サービス・アップデート
Oracle Cloud Infrastructure:2022年8月度サービス・アップデートOracle Cloud Infrastructure:2022年8月度サービス・アップデート
Oracle Cloud Infrastructure:2022年8月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年7月度サービス・アップデート
Oracle Cloud Infrastructure:2022年7月度サービス・アップデートOracle Cloud Infrastructure:2022年7月度サービス・アップデート
Oracle Cloud Infrastructure:2022年7月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年6月度サービス・アップデート
Oracle Cloud Infrastructure:2022年6月度サービス・アップデートOracle Cloud Infrastructure:2022年6月度サービス・アップデート
Oracle Cloud Infrastructure:2022年6月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年5月度サービス・アップデート
Oracle Cloud Infrastructure:2022年5月度サービス・アップデートOracle Cloud Infrastructure:2022年5月度サービス・アップデート
Oracle Cloud Infrastructure:2022年5月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年4月度サービス・アップデート
Oracle Cloud Infrastructure:2022年4月度サービス・アップデートOracle Cloud Infrastructure:2022年4月度サービス・アップデート
Oracle Cloud Infrastructure:2022年4月度サービス・アップデート
 
Oracle Cloud Infrastructure データベース・クラウド:各バージョンのサポート期間 (2022年4月版)
Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間 (2022年4月版)Oracle Cloud Infrastructureデータベース・クラウド:各バージョンのサポート期間 (2022年4月版)
Oracle Cloud Infrastructure データベース・クラウド:各バージョンのサポート期間 (2022年4月版)
 
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
MySQL Technology Cafe #14 MySQL Shellを使ってもっと楽をしようの会
 
Oracle Cloud Infrastructure:2022年3月度サービス・アップデート
Oracle Cloud Infrastructure:2022年3月度サービス・アップデートOracle Cloud Infrastructure:2022年3月度サービス・アップデート
Oracle Cloud Infrastructure:2022年3月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年2月度サービス・アップデート
Oracle Cloud Infrastructure:2022年2月度サービス・アップデートOracle Cloud Infrastructure:2022年2月度サービス・アップデート
Oracle Cloud Infrastructure:2022年2月度サービス・アップデート
 
Oracle Cloud Infrastructure:2022年1月度サービス・アップデート
Oracle Cloud Infrastructure:2022年1月度サービス・アップデートOracle Cloud Infrastructure:2022年1月度サービス・アップデート
Oracle Cloud Infrastructure:2022年1月度サービス・アップデート
 
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
Oracle Databaseはクラウドに移行するべきか否か 全10ケースをご紹介 (Oracle Cloudウェビナーシリーズ: 2021年11月30日)
 

Oracle Labs 発! Parallel Graph AnalytiX(PGX)

  • 1. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. Oracle Labs 発! Parallel Graph AnalytiX(PGX) 2017年10月3日 更新 日本オラクル株式会社 山中遼太(ryota.yamanaka@oracle.com)
  • 2. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. Safe Harbor 以下の事項は、弊社の一般的な製品の方向性に関する概要を説明するものです。 また、情報提供を唯一の目的とするものであり、いかなる契約にも組み込むこと はできません。以下の事項は、マテリアルやコード、機能を提供することを コミットメント(確約)するものではないため、購買決定を行う際の判断材料に なさらないで下さい。オラクル製品に関して記載されている機能の開発、 リリースおよび時期については、弊社の裁量により決定されます。 Oracle と Java は、Oracle Corporation 及びその子会社、関連会社の米国及びその他の国における 登録商標です。文中の社名、商品名等は各社の商標または登録商標である場合があります。 2
  • 3. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 3 グラフ・データベース?
  • 4. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. ネットワーク分析とグラフ • さまざまな関係構造をネットワークとして扱うことができる • このネットワークを点と線の集合として抽象化したものがグラフ • グラフ理論は数学の一つとして古くから発展してきた 4 1736年 ケーニヒスベルグの問題(オイラー) 無向/有向グラフ、多重グラフ、重み、… ※ 出典 (ライセンス: CC BY-SA 3.0) https://ja.wikipedia.org/wiki/一筆書き/media/File:7_bridges.svg
  • 5. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフ・データベース 5 DB-Engines に掲載のカテゴリ別人気変化率 (http://db-engines.com/en/ranking_categories)
  • 6. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. データを表に格納する 6 deptno dname loc 1 営業第一 東京 2 研究開発 大阪 3 マーケティング 東京 empno ename job deptno 1 アルバート 課長 1 2 バクスター 主任研究員 2 3 チェン 係長 3 4 デイヴィス エンジニア 2 社員表 部門表 主キー 主キー 外部キー SELECT e.ename FROM emp e, dept d WHERE e.deptno = d.deptno AND d.loc = 'Tokyo'
  • 7. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. データをグラフに格納する プロパティ・グラフなら、簡単かつ柔軟に表現することができ、 さらに、グラフ用の直感的なクエリ言語で検索することができる 7 SELECT e.ename WHERE (e)-[belong_to]->(d) , d.loc = 'Tokyo' 1 1 2 3 4 2 3 dname: 営業第一 loc: 東京 ename: アルバート job: 営業 belong_to from: 2013
  • 8. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 誰が最重要人物か? ― つながりの定量化 • 集計を用いた手法 • 誰が多く支払ったか? • 誰が高いマージンの商品を買ったか? • 誰が継続的に購入しているか? • つながりを用いた手法 • 誰が強い影響力を周りに対して持っているか? • 誰が特定人物と同じ商品を購入しているか? • 誰が若い世代のコミュニティに属しているか? 8 表に対する問い SQLのような計算 方法が適している グラフに対する問い なにか別の計算方法 が必要とされている!
  • 9. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 9 グラフ分析エンジン「PGX」
  • 10. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. Spatial and Graph オプション 10 Oracle Database Enterprise Edition 12c R2 Graph機能 ネットワーク・ データ・モデル RDF セマンティック ・グラフ Spatial機能 プロパティ・グラフ Spatial and Graph オプション
  • 11. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフ・データベースが最適? 11
  • 12. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. インメモリ解析 + 永続化ストレージ 12 RDBMS, Hadoop, NoSQL (KVS) Reques t 分析 処理 Reques t Reques t Reques t Reques t 更新 処理 PGX PGX メモリ上 データを並列処理で読み込み ノードとエッジとしてメモリ上に展開 Oracle Labs で開発された高速な インメモリのグラフ分析エンジン トランザクションはデータベースやHadoopで処理 グラフ用クエリ言語 PGQL や、定義済み グラフ分析アルゴリズムを API から使用可能 (ただし PGQL は DB 12.2.0.1 では未サポート) File
  • 13. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. Oracle Labs PGX 13 Oracle Labs(旧 Sun Labs)から OTN ライセンスで配布 • 商用利用はできませんが、無償で検証や開発ができます。
  • 14. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフ分析における2種類の処理 • 参照系処理 • あるノードの周辺ノードの参照 • プロパティ・パスによる探索 • パターン・マッチング • サブグラフの抽出 14 • 演算系処理 • コンポーネントやコミュニティの検出 • コミュニティ構造の評価 • ランキングとウォーキング • 経路探索 3 1 5 2 5 4 2 3 2 3 2 2 1 22 1 1 1
  • 15. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. PGX のコンセプト • 参照系処理と演算系処理の双方、 これらを組み合わせた処理に対応 • グラフのクエリによる参照(PGQL) • グラフへのアルゴリズムの適用 • グラフの変換(Mutation) 「あるノードから3ステップ 以内にあるページランクの 高いノード」を探す、など 15 3 1 5 2 5 4 2 3 2 3 2 2 1 22 1 1 1 3 1 5 2 5 4 2 3 2 3 2 2 1 22 1 1 1 演算! 参照!
  • 16. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 参照系処理 ― クエリ言語によるグラフの参照 • Neo4j Cypher に似たクエリ言語「PGQL」によってグラフを参照可能 • グラフのパターンを直感的に記述できる: • 「年齢がマリオより2歳下より若く、マリオとルイージが共に好いている 全ての人物の名前と年齢を、名前順に教えてください」 16 SELECT person.name, person.age WHERE (m WITH name='Mario') -[WITH type='likes']-> (person), (l WITH name='Luigi') -[WITH type='likes']-> (person), person.age < m.age - 2 ORDER BY person.name • 仕様詳細はこちら: PGQL 1.0 Specification
  • 17. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 演算系処理 ― 定義済みの35のアルゴリズム 17 コンポーネントやコミュニティの検出 強連結成分分解 (Tarjan法、Kosaraju法) 弱連結コンポーネント ラベル伝搬法 ランキングとウォーキング ページランク、 パーソナライズドページランク 中心媒介性、次数分布、次数中心性 近接中心性、固有ベクトル中心性 HITS、ランダムウォークサンプリング コミュニティ構造の評価 ∑ ∑ コンダクタンス モジュール性 クラスタ係数 トライアングル数え上げ 経路探索 幅優先探索、ダイクストラ法 双方向ダイクストラ法 ベルマン・フォード法 その他 リンク予測(SALSA)
  • 18. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフが利用されるビッグデータ課題 18 購買記録 顧客と商品 リコメンデーション 影響力のある 人物の特定 パターン・マッチングコミュニティの検出 私と買い物が似ている人 物によって購入された商 品と、その商品と一緒に 購入されている商品を教 えてください ソーシャル・ネットワー ク上で中心的な役割を 担っている人物を教えて ください(マーケティン グ分析など) 似通った人達やつながり のある人達のグループを 教えてください(ター ゲット・マーケティング など) ある不正取引と同様の取 引パターンがみられる全 ての預金口座を探してく ださい(不正検出や行動 分析など) Twitterなど
  • 19. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 19 使ってみる
  • 20. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. PGX のセットアップ(Linux) 20 $ cd $HOME/pgx # ここにファイルを置くとします $ unzip pgx-2.5.0-server.zip $ tar xvzf jdk-8u111-linux-x64.tar.gz $ export JAVA_HOME=$HOME/pgx/jdk1.8.0_111 $ export PATH=$JAVA_HOME/bin:$PATH $ export PGX_HOME=$HOME/pgx/pgx-2.5.0 $ alias pgx='$PGX_HOME/bin/pgx' 環境変数とエイリアスを設定します ファイルを展開します 最新版の PGX 2.5.0 Server をこちらからダウンロードします JDK8(下記では 8u111)もこちらからダウンロードします 参考 Oracle Labs PGX 2.5.0 Documentation – Installation
  • 21. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. PGX のセットアップ(Mac) 21 $ cd $HOME/pgx # ここにファイルを置くとします $ unzip pgx-2.5.0-server.zip $ export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.8.0_111.jdk/Contents/Home/ $ export PATH=$JAVA_HOME/bin:$PATH $ export PGX_HOME=$HOME/pgx/pgx-2.3.1 $ alias pgx='$PGX_HOME/bin/pgx' 環境変数とエイリアスを設定します ファイルを展開します 最新版の PGX 2.5.0 Server をこちらからダウンロードします JDK8(下記では 8u111)もこちらからダウンロードしてインストールします 参考 Oracle Labs PGX 2.5.0 Documentation – Installation
  • 22. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. PGX シェルの起動 22 $ pgx .. pgx> PGXシェルを起動します pgx> :exit PGXシェルを閉じるとき pgx> :clear PGXシェルの誤入力でエラーが発生した際はヒストリーをクリアしてください
  • 23. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフの読み込み 23 $ cd $PGX_HOME $ pgx PGXシェルを起動します G = session.readGraphWithProperties("examples/graphs/sample.adj.json") G.queryPgql(" SELECT x.id(), y.id() WHERE (x)-->(y) ").print() x.id() y.id() ============================================ 333 128 128 1908 128 99 99 333 サンプルのデータをロードした後、全てのエッジを参照します 333 128 1908 99
  • 24. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. Marvel ヒーローのグラフ • Marvel のコミックには 多くのキャラクターが登場 • さらに、ヒーロー達が集まって 敵と戦ったり、他のコミックに 友情出演することが多々ある • そこでキャラクターの共演を グラフにして解析する 24 ※ 出典 http://www.oracle.com/us/theavengers /avengers-main-body-1571184.html (壁紙もダウンロードできます)
  • 25. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. データの入手 25 $ more hero-network.csv "IRON MAN/TONY STARK ","CHAIN" "IRON MAN/TONY STARK ","SPIDER-WOMAN II/JULI" "IRON MAN/TONY STARK ","CARPENTER, RACHEL" "CARPENTER, RACHEL","CHAIN" "CARPENTER, RACHEL","SPIDER-WOMAN II/JULI" .. Exposedata.com (http://exposedata.com/marvel/) のウェブ・アーカイブの 「Hero Social Network Data」からCSVデータを入手します このデータは、キャラクターをノードとして、コミックの同じ号に登場している キャラクター同士をカンマ区切りで対にしただけのものです
  • 26. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフのロード 26 G = session.readGraphWithProperties("hero/hero-network.csv.json").undirect() $ vi hero-network.csv.json { "uri": "hero-network.csv" , "format": "edge_list" , "node_id_type": "string" , "separator": "," } $ pgx グラフのロードのための情報をJSONで記述します PGXシェルから上のファイルを指定してグラフをロードします (無向グラフとして読み込んでいます)
  • 27. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフのロード 27 キャラクター(ノード)を表示します G.queryPgql(" SELECT x.id() WHERE (x) ").print() G.queryPgql(" SELECT x.id() WHERE (x) ").getNumResults() ==> 6426 キャラクター(ノード)の数を表示します G.queryPgql(" SELECT r.id() WHERE (x)-[r]-(y) ").getNumResults() ==> 1146702 一緒に登場するキャラクターの組(エッジ)の数を表示します
  • 28. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフのロード 28 G = G.simplify( MultiEdges.REMOVE_MULTI_EDGES , SelfEdges.REMOVE_SELF_EDGES , TrivialVertices.REMOVE_TRIVIAL_VERTICES , Mode.CREATE_COPY , null ) ロードしたグラフに前処理を施します G.queryPgql(" SELECT r.id() WHERE (x)-[r]-(y) ").getNumResults() ==> 334414 一緒に登場するキャラクターの組(エッジ)の数を表示します # 同じ2つのノードを結ぶ複数のエッジを除去 # 始点と終点が同じノードのエッジを除去 # エッジを持たないノードを除去 # 内部的にグラフのコピーを作成 # グラフ名(任意)
  • 29. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 参照型処理の実行 PGQLは参照型処理(パターン・マッチング)に便利です 「アイアンマンとスパイダーマンとウルヴァリンの全てと 一緒に登場したことのあるキャラクターは?」 29 G.queryPgql(" SELECT x.id() WHERE (x)--(a WITH id()='IRON MAN/TONY STARK ') , (x)--(b WITH id()='SPIDER-MAN/PETER PAR') , (x)--(c WITH id()='WOLVERINE/LOGAN ') ").print()
  • 30. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 参照型処理の実行 結果の件数が多いので、一度、結果データを変数に渡して件数を数えます 30 Result = G.queryPgql(" SELECT x.id() WHERE (x)--(a WITH id()='IRON MAN/TONY STARK ') , (x)--(b WITH id()='SPIDER-MAN/PETER PAR') , (x)--(c WITH id()='WOLVERINE/LOGAN ') ") Result.getNumResults() ==> 504 10件だけ見てみます Result.print(5)
  • 31. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. ヒーローの重要度の評価 • 次数中心性 • より多くのエッジを持つノードがより重要 • 友だちが多い人は重要人物? • ページランク • 重要性はグラフ上で伝播するとすれば… • 重要なノードに繋がるノードは重要 • 重要人物の友だちは重要人物? • 媒介中心性 • 多くのノード同士の最短経路にいると重要 • その人がいないとみんなが困る? 31 Iron man Cap Amer Iron man Hulk Nick Cap Amer
  • 32. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 演算型処理の実行 まず、各ノードの次数中心性を求めます 32 analyst.inDegreeCentrality(G) 計算されたスコアは各ノードの プロパティ in_degree に格納されます 引数として、グラフ(G)が渡されています。計算量はノードの数 N、エッジ数 を E としたとき、計算量は N に依存して増加するため O (N) になります。詳細 はリファレンスに記載されています。 ==> Vertex Property named 'in_degree' of type integer belonging to graph .. Iron man in_degree: 3
  • 33. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 演算型処理の実行 5人の重要なキャラクターが得られました! 33 | n.id() | n.in_degree | ====================================== | CAPTAIN AMERICA | 1906 | | SPIDER-MAN/PETER PAR | 1737 | | IRON MAN/TONY STARK | 1522 | | THING/BENJAMIN J. GR | 1416 | | MR. FANTASTIC/REED R | 1379 | G.queryPgql(" SELECT n.id(), n.in_degree WHERE (n) ORDER BY n.in_degree DESC ").print(5) 計算結果を参照するためには、PGQLを使います
  • 34. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 演算型処理の実行 次に、各ノードのページランクを求めます 34 analyst.pagerank(G, 0.0001, 0.85, 100) 計算されたスコアは各ノードの プロパティ pagerank に格納されます 引数として、グラフ(G)および3つのパラメータ(許容される最大エラー値、ダ ンピング・ファクター、計算の反復回数)が渡されています。計算量は反復回数 を k として O (k*E) になります。詳細はリファレンスに記載されています。 ==> Vertex Property named 'pagerank' of type double belonging to graph .. Ironman pagerank: 0.0041204
  • 35. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 演算型処理の実行 スパイダーマンが1位になりました! 35 | n.id() | n.pagerank | ================================================ | SPIDER-MAN/PETER PAR | 0.005295697226042497 | | CAPTAIN AMERICA | 0.005125996140362315 | | IRON MAN/TONY STARK | 0.0041204415753377755 | | WOLVERINE/LOGAN | 0.0038669573843525297 | | THING/BENJAMIN J. GR | 0.00368240604720028 | G.queryPgql(" SELECT n.id(), n.pagerank WHERE (n) ORDER BY n.pagerank DESC ").print(5) 計算結果を参照するためには、PGQLを使います
  • 36. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 演算型処理の実行 同様に、各ノードの媒介中心性も求めてみます 36 analyst.vertexBetweennessCentrality(G) 媒介中心性は、全ての頂点間の最短経路の中でその頂点が経路上にいる割合を スコアとしています。媒介中心性の計算量は O (N*E) であり、ページランクの 計算量 O (k*E) と比較して計算コストが高く、やや実行時間が長くかかります。 詳細はリファレンスに記載されています。 ==> Vertex Property named 'betweenness' of type double belonging to graph .. 計算されたスコアは各ノードの プロパティ betweenness に格納されます Ironman pagerank: 0.0072942 betweenness: 1536742
  • 37. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 演算型処理の実行 トップ4まではページランクとも順位が一致しています 37 | n.id() | n.betweenness | ============================================= | SPIDER-MAN/PETER PAR | 3035278.742514685 | | CAPTAIN AMERICA | 2351348.199987786 | | IRON MAN/TONY STARK | 1536742.6554027207 | | WOLVERINE/LOGAN | 1473595.2238889316 | | HAVOK/ALEX SUMMERS | 1471842.538198293 | G.queryPgql(" SELECT n.id(), n.betweenness WHERE (n) ORDER BY n.betweenness DESC ").print(5) 計算結果を参照するためには、PGQLを使います
  • 38. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 参照と演算の併用 38 演算型処理の結果(ここではページランクのスコア)を参照型処理(パターン・ マッチング)の対象としてそのまま使えてしまうのがPGQLの便利なところ! 前出の検索をこのように変更してみます。 「アイアンマンとスパイダーマンとウルヴァリンの全てと一緒に登場したこと のあるキャラクターのうちマイナーなキャラクターは?」 Result = G.queryPgql(" SELECT x.id(), x.pagerank WHERE (x)--(a WITH id()='IRON MAN/TONY STARK ') , (x)--(b WITH id()='SPIDER-MAN/PETER PAR') , (x)--(c WITH id()='WOLVERINE/LOGAN ') ORDER BY x.pagerank ASC ")
  • 39. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 参照と演算の併用 39 こちらがマイナーなキャラクター10名です Result.print(10) | x.id() | x.pagerank | ================================================ | TYCHO | 5.611553899059807E-5 | | ISBISA/DR. SANDERSON | 7.622033978468877E-5 | | MASON, WANDA | 9.52103640547917E-5 | | STORM, CHILI | 1.087940205195763E-4 | | MAGNUM, MOSES | 1.0989429673080101E-4 | | BIRD MAN/HENRY HAWK | 1.206812449804567E-4 | | CAT MAN/HORGAN | 1.206812449804567E-4 | | TERRAXIA | 1.2137478460591338E-4 | | RAZORFIST III | 1.23495696066652E-4 | | SVAROG | 1.2727748790164624E-4 |
  • 40. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. タンパク質のネットワークであれば… 40 「タンパク質 A、B、C の全てと相互作用があるタンパク質のうちネットワーク 上の重要性が低いタンパク質(ロングテールの標的の可能性がある)は?」 Res = G.queryPgql(" SELECT x, x.pagerank WHERE (x)--(a WITH id()='Protein A') , (x)--(b WITH id()='Protein B') , (x)--(c WITH id()='Protein C') ORDER BY x.betweenness ASC ") A X CB 中心媒介性: 0.00129(低) STRING Database http://string-db.org/
  • 41. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 41 乗換案内
  • 42. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. データの入手 42 駅データ.jp から、駅データ、接続駅データ、路線データを入手します。 line_cd,company_cd,line_name,line_name_k, .. 1001,3,中央新幹線,チュウオウシンカンセン, .. 1002,3,東海道新幹線,トウカイドウシンカンセン, .. 1003,4,山陽新幹線,サンヨウシンカンセン, .. line_cd,station_cd1,station_cd2 1002,100201,100202 1002,100202,100203 1002,100203,100204 接続駅データはエッジです。 station_cd,station_g_cd,station_name, .. 1110101,1110101,函館, .. 1110102,1110102,五稜郭, .. 1110103,1110103,桔梗, .. 駅データはノードとそのプロパティです。 路線データはエッジのプロパティです。
  • 43. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. データの加工 43 $ sort -t ',' -k 1 station20161107free.csv > station.csv $ sort -t ',' -k 1 line20161107free.csv > line.csv $ sort -t ',' -k 2 join20161107.csv > join01.csv $ join -t ',' join01.csv station.csv -1 2 -2 1 -o 1.1,2.2,1.3 > join02.csv $ sort -t ',' -k 3 join02.csv > join03.csv $ join -t ',' join03.csv station.csv -1 3 -2 1 -o 1.1,1.2,2.2 > join04.csv $ sort -t ',' -k 1 join04.csv > join05.csv $ join -t ',' join05.csv line.csv -1 1 -2 1 -o 2.3,1.2,1.3 > join06.csv $ cat station.csv | awk -v FS=',' -v OFS=',' '{if (NR != 1) print $2, "*"}' | sort | uniq > station_uniq.csv $ join -t ',' station_uniq.csv station.csv -1 1 -2 1 -o 1.1,1.2,2.3 > rail.csv $ cat join06.csv | awk -v FS=',' -v OFS=',' '{print $2, $3, $1, "1"}' >> rail.csv データを Edge List 形式に加工します。
  • 44. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフのロード 44 $ vi rail.csv.json { "uri": "rail.csv" , "format": "edge_list" , "node_id_type": "integer" , "vertex_props":[ {"name":"name", "type":"string"} ] , "edge_props":[ {"name":"name", "type":"string"} , {"name":"score", "type":"double"} ] , "separator": "," } グラフのロードのための情報をJSONで記述します
  • 45. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. グラフのロード 45 PGXシェルを開き、グラフを(有向グラフのまま)ロードします G = session.readGraphWithProperties("rail/rail.csv.json") 同じ駅間は複数の路線で接続されていることがあるため、 このグラフは同じノード間に複数のエッジが含まれ得るグラフです G.queryPgql(" SELECT x.name, y.name, r.name WHERE (x)-[r]-(y), x.name='恵比寿', y.name='渋谷' ").getResults() ==> x.name(STRING)=恵比寿 y.name(STRING)=渋谷 r.name(STRING)=JR湘南新宿ライン ==> x.name(STRING)=恵比寿 y.name(STRING)=渋谷 r.name(STRING)=JR埼京線 ==> x.name(STRING)=恵比寿 y.name(STRING)=渋谷 r.name(STRING)=JR山手線
  • 46. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 有向グラフと無効グラフ 46 G.queryPgql(" SELECT x.name, r.name, y.name WHERE (x)-[r]->(y), x.name='外苑前' ").getResults() 外苑前のとなりの駅と路線 ==> x.name(STRING)=外苑前 r.name(STRING)=東京メトロ銀座線 y.name(STRING)=表参道 G.queryPgql(" SELECT x.name, r.name, y.name WHERE (x)<-[r]-(y), x.name='外苑前' ").getResults() ==> x.name(STRING)=外苑前 r.name(STRING)=東京メトロ銀座線 y.name(STRING)=青山一丁目 逆方向の駅
  • 47. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 有向グラフと無効グラフ 47 G.queryPgql(" SELECT x.name, r.name, y.name WHERE (x)-[r]-(y), x.name='外苑前' ").getResults() ==> x.name(STRING)=外苑前 r.name(STRING)=東京メトロ銀座線 y.name(STRING)=青山一丁目 ==> x.name(STRING)=外苑前 r.name(STRING)=東京メトロ銀座線 y.name(STRING)=表参道 無効グラフにすることにより、同じ路線の逆方向の駅が出力されます 実際には多くの路線は両方向なので、無効グラフに変換します G = G.undirect()
  • 48. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 経路の検索 48 G.queryPgql(" SELECT y.name, COUNT(*) AS cnt WHERE (x)--()--()--(y), x.name='外苑前' GROUP BY y.name ORDER BY cnt DESC ").getResults() 外苑前から3ホップの駅とその経路の数を求めます ==> y.name(STRING)=青山一丁目 cnt(LONG)=9 ==> y.name(STRING)=表参道 cnt(LONG)=9 ==> y.name(STRING)=恵比寿 cnt(LONG)=6 ==> y.name(STRING)=新宿 cnt(LONG)=6 ==> y.name(STRING)=原宿 cnt(LONG)=5 ==> y.name(STRING)=渋谷 cnt(LONG)=4 ==> y.name(STRING)=溜池山王 cnt(LONG)=4 ... 同じ駅を行き来することができるため隣の駅への経路が多く出力されます
  • 49. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 経路の検索 49 G.queryPgql(" SELECT y.name, COUNT(*) AS cnt WHERE (x)--(s1)--(s2)--(y), x.name='外苑前', x!=s1, x!=s2, x!=y, s1!=s2, s1!=y, s2!=y GROUP BY y.name ORDER BY cnt DESC ").getResults() 同じ駅を2度通らないように条件を追加します ==> y.name(STRING)=恵比寿 cnt(LONG)=6 ==> y.name(STRING)=新宿 cnt(LONG)=6 ==> y.name(STRING)=原宿 cnt(LONG)=5 ==> y.name(STRING)=四ツ谷 cnt(LONG)=4 ==> y.name(STRING)=渋谷 cnt(LONG)=4 ==> y.name(STRING)=溜池山王 cnt(LONG)=4 ==> y.name(STRING)=桜田門 cnt(LONG)=2 ==> y.name(STRING)=半蔵門 cnt(LONG)=2 ...
  • 50. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 経路の検索 50 G.queryPgql(" SELECT r1.name, r2.name, r3.name WHERE (x)-[r1]-(s1)-[r2]-(s2)-[r3]-(y), x.name='外苑前', y.name='新宿', x!=s1, x!=s2, x!=y, s1!=s2, s1!=y, s2!=y ").getResults() 経路を確認します ==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ半蔵門線 r3.name(STRING)=JR湘南新宿ライン ==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ半蔵門線 r3.name(STRING)=JR成田エクスプレス ==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ銀座線 r3.name(STRING)=JR湘南新宿ライン ==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ銀座線 r3.name(STRING)=JR成田エクスプレス ==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ半蔵門線 r3.name(STRING)=JR埼京線 ==> r1.name(STRING)=東京メトロ銀座線 r2.name(STRING)=東京メトロ銀座線 r3.name(STRING)=JR埼京線
  • 51. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 重要度の高い駅は? 各駅の次数中心性、ページランク、媒介中心性も求めてみます。 同じ駅間に複数の路線があった場合にもひとつのエッジとして計算できるように グラフを変換します。複数の路線のうちひとつのみを残して他は削除されます。 51 analyst.inDegreeCentrality(G) analyst.pagerank(G, 0.0001, 0.85, 100) analyst.vertexBetweennessCentrality(G) G = G.simplify( MultiEdges.REMOVE_MULTI_EDGES , SelfEdges.REMOVE_SELF_EDGES , TrivialVertices.REMOVE_TRIVIAL_VERTICES , Mode.CREATE_COPY , null )
  • 52. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 重要度の高い駅は? 52 G.queryPgql(" SELECT n.name, n.in_degree WHERE (n) ORDER BY n.in_degree DESC ").getResults() 次数中心性の高い駅を参照します ==> n.name(STRING)=横浜 n.in_degree(INTEGER)=14 ==> n.name(STRING)=新宿 n.in_degree(INTEGER)=13 ==> n.name(STRING)=池袋 n.in_degree(INTEGER)=13 ==> n.name(STRING)=大阪 n.in_degree(INTEGER)=12 ==> n.name(STRING)=千葉 n.in_degree(INTEGER)=11 ==> n.name(STRING)=名古屋 n.in_degree(INTEGER)=11 ==> n.name(STRING)=東京 n.in_degree(INTEGER)=11 ==> n.name(STRING)=品川 n.in_degree(INTEGER)=11 ==> n.name(STRING)=大宮 n.in_degree(INTEGER)=9 ==> n.name(STRING)=金山 n.in_degree(INTEGER)=9 ※ 出典 (ライセンス: CC BY-SA 4.0) https://ja.wikipedia.org/wiki/新宿駅#/media/File:JR_Shinjuku_Miraina_TowerB.JPG
  • 53. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 重要度の高い駅は? 53 G.queryPgql(" SELECT n.name, n.pagerank WHERE (n) ORDER BY n.pagerank DESC ").getResults() ページランクの高い駅を参照します ※ 出典 (ライセンス: CC BY 3.0) https://ja.wikipedia.org/wiki/横浜駅#/media/File:横浜駅西口方駅舎.jpg ==> n.name(STRING)=横浜 n.pagerank(DOUBLE)=4.9.. ==> n.name(STRING)=池袋 n.pagerank(DOUBLE)=4.5.. ==> n.name(STRING)=新宿 n.pagerank(DOUBLE)=4.2.. ==> n.name(STRING)=名古屋 n.pagerank(DOUBLE)=4.0.. ==> n.name(STRING)=千葉 n.pagerank(DOUBLE)=4.0.. ==> n.name(STRING)=大阪 n.pagerank(DOUBLE)=3.8.. ==> n.name(STRING)=三ノ宮 n.pagerank(DOUBLE)=3.6.. ==> n.name(STRING)=大宮 n.pagerank(DOUBLE)=3.4.. ==> n.name(STRING)=金山 n.pagerank(DOUBLE)=3.3.. ==> n.name(STRING)=品川 n.pagerank(DOUBLE)=3.3..
  • 54. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 重要度の高い駅は? 54 G.queryPgql(" SELECT n.name, n.betweenness WHERE (n) ORDER BY n.betweenness DESC ").getResults() 媒介中心性の高い駅を参照します ※ 出典 (ライセンス: GFDL) https://ja.wikipedia.org/wiki/塩尻駅#/media/File:ShiojiriStnishi.jpg ==> n.name(STRING)=塩尻 n.betweenness(..)=3.5.. ==> n.name(STRING)=恵那 n.betweenness(..)=3.4.. ==> n.name(STRING)=多治見 n.betweenness(..)=3.4.. ==> n.name(STRING)=土岐市 n.betweenness(..)=3.4.. ==> n.name(STRING)=瑞浪 n.betweenness(..)=3.4.. ==> n.name(STRING)=釜戸 n.betweenness(..)=3.4.. ==> n.name(STRING)=武並 n.betweenness(..)=3.4.. ==> n.name(STRING)=美乃坂本 n.betweenness(..)=3.4.. ==> n.name(STRING)=中津川 n.betweenness(..)=3.4.. ==> n.name(STRING)=落合川 n.betweenness(..)=3.4..
  • 55. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 重要度の高い駅は? 55
  • 56. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 連結している? 56 G.queryPgql(" SELECT x.wcc, COUNT(*) AS num_station WHERE (x) GROUP BY x.wcc ORDER BY num_station DESC ").print() 出発と到着の駅のノードIDを確認しておきます 連結成分を計算します(WCC: Weakly Connected Compornent) analyst.wcc(G) | x.wcc | num_station | +---------------------+ | 1 | 8915 | | 0 | 15 |
  • 57. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 連結している? 57 分割された小さいほうのグラフに含まれる駅を表示します G.queryPgql(" SELECT r.name, x.name, y.name WHERE (x)-[r]-(y), x.wcc=0, y.wcc=0 ").getResults() ==> r.name(STRING)=ゆいレール x.name(STRING)=那覇空港 y.name(STRING)=赤嶺 ==> r.name(STRING)=ゆいレール x.name(STRING)=赤嶺 y.name(STRING)=那覇空港 ==> r.name(STRING)=ゆいレール x.name(STRING)=赤嶺 y.name(STRING)=小禄 ==> r.name(STRING)=ゆいレール x.name(STRING)=小禄 y.name(STRING)=赤嶺 ==> r.name(STRING)=ゆいレール x.name(STRING)=小禄 y.name(STRING)=奥武山公園 ==> r.name(STRING)=ゆいレール x.name(STRING)=奥武山公園 y.name(STRING)=小禄 ==> r.name(STRING)=ゆいレール x.name(STRING)=奥武山公園 y.name(STRING)=壺川 ==> r.name(STRING)=ゆいレール x.name(STRING)=壺川 y.name(STRING)=奥武山公園 ==> r.name(STRING)=ゆいレール x.name(STRING)=壺川 y.name(STRING)=旭橋 ==> r.name(STRING)=ゆいレール x.name(STRING)=旭橋 y.name(STRING)=壺川
  • 58. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 最短経路は? 58 G.queryPgql(" SELECT x.id() WHERE (x), x.name='外苑前' ").print() G.queryPgql(" SELECT x.id() WHERE (x), x.name='名古屋' ").print() 出発と到着の駅のノードIDを確認しておきます | x.id() | +---------+ | 2800117 | | x.id() | +---------+ | 1190412 |
  • 59. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 最短経路は? 59 Path.getPathLengthWithHop() 最短で何ホップで到達できるかがわかります。 ==> 360 エッジのスコア(今回は距離や時間のデータがないため全て 1 としています)を 指定してダイクストラ法で最短経路を計算します。計算量は O (N log(N)) です。 node1 = G.getVertex(2800117) node2 = G.getVertex(1190412) score = G.getEdgeProperty("score") Path = analyst.shortestPathDijkstra(G, node1, node2, score) Path.exists() ==> true
  • 60. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 最短経路は? 60 最短経路上の駅を確認します。ただし、このデータには新幹線など一部のデータ が含まれていないことにご留意ください。 vList = Path.getVertices() eList = Path.getEdges() hops = Path.getPathLengthWithHop() for (i=0; i<hops+1; i++) { print vList[i].getProperty("name") if (i==hops) { print "n" } else { print " > " } } 外苑前 > 表参道 > 渋谷 > 新宿 > 吉祥寺 > 三鷹 > 国分寺 > 立川 > 八王子 > 高尾 > 相模湖 > 藤野 > 上野原 > 四方津 > (略) > 加治木 >錦江 > 帖佐 > 姶良 > 重富 > 竜ケ水 > 鹿児島
  • 61. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 61 PGX.D
  • 62. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. PGX.D ― 分散処理版 PGX 62
  • 63. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. PGX.D ― HPC の SC15 で Best Paper のひとつに 63 http://sc15.supercomputing.org/conference-program/technical-program/papers/best-student-paper-and-paper-finalists
  • 64. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 64 参考資料
  • 65. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved. 参考資料 • Oracle Labs PGX(再掲) • 関連する Oracle 製品 • Oracle Database Spatial and Graph • Oracle Big Data Spatial and Graph • 関連する SlideShare 資料 • Hadoop Conference Japan 2016 LT資料 グラフデータベース事始め • オラクルのHadoopソリューションご紹介 65
  • 66. Copyright © 2016-2017 Oracle and/or its affiliates. All rights reserved.

Hinweis der Redaktion

  1. Future Directions > Database Integration https://docs.oracle.com/cd/E56133_01/1.2.0/about/future.html
  2. PGX provides many built-in algorithms. The typical competing graph analytic product provides 3 to 5 algorithms, we provide more than 35 built in algorithms spanning a variety of different tasks including community detection, ranking and walking and path finding [] PGX also provides support for mutating the graph in parallel. These are useful for some of the algorithms as well as when building composite algorithms which involve multiple steps of analysis. Link Prediction: SALSA (Twitter’s Who-to-follow) Other Classics: Vertex Cover, Minimum Spanning-Tree (Prim’s)
  3. Recommendation systems however infer links based on commonality or correlations in properties or links. For example, you rated Goodwill Hunting as 5. You are then implicitly linked to others who also rated it a 5 and then the set of other movies they rate a 5 is used to suggest movies you may want to watch. So the community of folks who like movies like Goodwill Hunting is computed from inferred links rather than explicit links. Influencers is standard social network analysis.  It is determined by things like Centrality, connectedness Community detection is about finding subgraphs (or groups) that are already linked to each (i.e. the links exist) other and who mostly interact with each (tweet to, follow) other and there are much fewer, if any, links or interactions outside the group. Fraud detection is special in that it uses a combination of statistical, data mining, and graph analysis to find anomalies. The first one is the product recommendation use case which all of us have probably seen with Amazon , eBay, etc. where by looking at the purchasing behavior of similar customers, a set of products or services are recommended. Recommendation engines infer what you like based on commonality or correlations in properties or links among nodes. You can use graph technologies very effectively to address these kinds of use cases. Sentiment analysis and customer analytics come into play. The second one is identifying influencers in a network. For example doing churn analysis, if someone leaves or buys then who is likely to follow. This involves analyzing centrality and reach. Graph analytics can help you discover who is the most connected and what is the extent of their reach. Highly connected nodes that have many links that are also linked to others are likely to represent key influencers. The third one is community detection and is useful in typical social network analysis. Communities are subgraphs or groups that are tightly linked to each other with fewer connections outside the subgraph. There are algorithms to help you detect different kinds of communities and clusters, such as which groups of entities are connected to each other for targeted marketing, identifying terrorist cells, etc. The fourth use case is around pattern matching. This may involve multiple analytics, for instance community detection followed by search for similar patterns of relationships. This is very useful in cyber-security and in fraud detection. Fraud detection, for example, is a specialized combination of statistics, data mining, and graph analysis to find anomalies.
  4. G = session.readGraphWithProperties("rail.tsv.json") G = session.readGraphWithProperties("rail.tsv.json").undirect()   G.queryPgql(" SELECT x.name, y.name WHERE (x)-->()-->()-->(y), x.name='外苑前' ").print(10) G.queryPgql(" SELECT x.name, y.name, r.name WHERE (x)-[r]->(y), x.name='外苑前' ").print(10) G.queryPgql(" SELECT x.name, y.name, r1.name WHERE (x)-[r1]->()-[r2]->(y), x.name='外苑前' ").print(20) G.queryPgql(" SELECT x.id(), y.id(), r.name WHERE (x)-->()-[r]->(y), x.name='外苑前' ").print(10)     G.queryPgql(" SELECT x.id() WHERE (x), x.name='新大阪' ").print() G.queryPgql(" SELECT x.id() WHERE (x), x.name='長崎' ").print()   node1 = G.getVertex(2800117) node2 = G.getVertex(9981709) score = G.getEdgeProperty("score") Res = analyst.shortestPathDijkstra(G, node1, node2, score)   Res.getPathLengthWithHop() Res.getVertices() #!/bin/sh   rm rail.tsv   sort -t ',' -k 1 station20160401free.csv > station.csv sort -t ',' -k 1 line20160402free.csv > line.csv   sort -t ',' -k 2 join20160401.csv > join01.csv join -t ',' join01.csv station.csv -1 2 -2 1 -o 1.1,2.2,1.3 > join02.csv   sort -t ',' -k 3 join02.csv > join03.csv join -t ',' join03.csv station.csv -1 3 -2 1 -o 1.1,1.2,2.2 > join04.csv   sort -t ',' -k 1 join04.csv > join05.csv join -t ',' join05.csv line.csv -1 1 -2 1 -o 2.3,1.2,1.3 > join06.csv   cat station20160401free.csv |\ awk -v FS=',' -v OFS=' ' '{if (NR != 1) print $2, "*", $1, $3}' >> rail.tsv   cat join06.csv |\ awk -v FS=',' -v OFS=' ' '{print $2, $3, $1, "1"}' >> rail.tsv   cat join06.csv |\ awk -v FS=',' -v OFS=' ' '{print $3, $2, $1, "1"}' >> rail.tsv { "uri": "rail.tsv" , "format": "edge_list" , "node_id_type": "integer" , "vertex_props":[ {"name":"cd", "type":"integer"} , {"name":"name", "type":"string"} ] , "edge_props":[ {"name":"name", "type":"string"} , {"name":"score", "type":"double"} ] , "separator": " " }  
  5. 外苑前から表参道への経路 G.queryPgql(" \ SELECT r1.name, s1.name, r2.name, s2.name, r3.name, y.name WHERE (x)-[r1]->(s1)-[r2]->(s2)-[r3]->(y), \ x.name='外苑前', y.name='表参道' \ ").print()
  6. 外苑前から新宿への経路 G.queryPgql(" \ SELECT r1.name, s1.name, r2.name, s2.name, r3.name, y.name WHERE (x)-[r1]->(s1)-[r2]->(s2)-[r3]->(y), \ x.name='外苑前', y.name='新宿', x!=s1, x!=s2, x!=y, s1!=s2, s1!=y, s2!=y \ ").print()
  7. 新宿の隣の駅 G.queryPgql(" \ SELECT x.name, r.name, y.name WHERE (x)-[r]->(y), x.name='金山' \ ").print()