More Related Content
Similar to 分散グラフデータベース DataStax Enterprise Graph (20)
More from Yuki Morishita (8)
分散グラフデータベース DataStax Enterprise Graph
- 5. プロパティグラフ
- ノード(頂点/Vertex) エンティティ
- エッジ(辺/Edge) リレーション
- プロパティ エンティティやリレーションの属性
Resides
Purchased
Purchased
Has
Belongs To
Ships To
- 10. RDBMS vs. グラフ
- グラフデータベースとRDBMSの主要な違いの一つは、エンティティ/頂点の間の関係が優先付けされ管
理される方法。
- RDBMSでは外部キーを使ってエンティティを二次的に繋ぐのに対し、グラフデータベースにおか
えるエッジ(リレーション)は、第1級の重要性を持つ。
- リレーションがグラフデータモデルに明示的に組み込まれる。
- グラフ型のビジネス課題とは、個別のエンティティでなく、エンティティ(頂点)間のリレーション
(エッジ)が関心事であるもの。
RDBMS グラフ
「何か」識別できるもの、あるいは追跡するオブジェクト エンティティ ノード(Vertex)
2つのオブジェクトの間のつながりまたは参照 リレーション エッジ(Edge)
オブジェクトの特性 属性 プロパティ
- 13. Apache Cassandra™との統合
- DSE Graphは、常時オン、どこでも書き込み・読み取り・アクティブの機能、リニア
なスケーラビリティ、安定的な低レイテンシーのレスポンスタイム、成熟した運用手
法をはじめとするCassandraの主要な利点を引き継ぐ
- その基礎の上に、DSE Graphは適応型のクエリーオプティマイザー、局所性優先のグ
ラフデータパーティショナー、分散クエリー実行エンジン、各種のグラフ固有イン
デックス構造などを含む、パフォーマンス強化のための機能を追加
- 15. DSE Graphのアーキテクチャ
DataStax Enterprise Graph
Apache TinkerPop™
GraphComputer
Apache TinkerPop™
Gremlin Server
Apache Spark™
Apache Cassandra™
Storage / Indexing
Apache Solr™
Indexing
アプリケーション
(DataStax Driver)
DataStax Studio
Apache TinkerPop™
Gremlin Console
3rdパーティ
グラフ可視化ツール
DSE Server
OLAP OLTP
- 17. Gremlin
- グラフトラバーサル言語
// Lisaが購入した全ての注文を探す
g.V().has('customer', 'name', 'Lisa')
.out('ordered')
.values('number')
// Lisaの友人が購入した全ての商品を探す
g.V().has('customer', 'name', 'Lisa')
.outE('related').has('Type', 'friend')
.inV().out('ordered').out('purchased')
.values('name’)
1
Customer
Name:[Lisa]
Age:[32]
2
Order
Number:[1234]
5
Product
Name:[Socks]
Size: [XL]
4
Customer
Name:[Frank]
Age:[28]
6
Product
Name:[Shirt]
Size: [XL] 7
Address
Stree:[123 West Street]
Zip Code:[44534]
11
12 13
14
15
16
17
3
Tag
Type:[Color]
Value: [White]
18
19
orders
Date:[1/1/2016]
related
Type:Friend
resides
Since:1/1/2000
ships
Shipment Date:1/2/2016
purchased
Qty: 42
purchased
Qty: 1
has
Valid: 1/1/2012
has
Valid: 1/1/2012
- 21. GLV (Gremlin Language Variant)
import com.datastax.dse.graph.api.DseGraph;
GraphTraversalSource g = DseGraph.traversal();
GraphTraversal traversal = g.V().values("name").range(0, 4).groupCount();
GraphStatement statement = DseGraph.statementFromTraversal(traversal);
GraphResultSet results = dseSession.executeGraph(statement);
from dse_graph import DseGraph
g = DseGraph.traversal_source()
traversal = g.V().name[0:4].groupCount()
statement = DseGraph.query_from_traversal(traversal)
results = dse_session.execute_graph(statement)
- 23. 映画のレコメンデーション
- データセット: MovieLense 1M Dataset
- https://grouplens.org/datasets/movielens/1m/
- レイティング: 約1,000,000
- ユーザー: 約6,000
- 映画: 約4,000
- (2003年2月時点)
- レコメンデーション
- 「この映画を高く評価したユーザーは、こんな映画も好きなはず。」
- 24. デモ環境
- Dockerコンテナ
- DataStax Enterprise 5.1.2
- Search と Graph を有効化
- DataStax Studio 2.0.0
- DataStaxオフィシャルイメージは準備中
- 弊社エバンジェリストが公開しているものも利用できる
- https://github.com/LukeTillman/dse-docker
- https://github.com/LukeTillman/ds-studio-docker
- 28. ノードとエッジの追加
g.addV('movie').property('id', 9999)
.property('name', 'Death Note')
.property('year', 2017)
g.addV('user').property('id', 9999)
.property('gender', 'M')
g.V().has('movie', 'id', 9999).as('m')
.V().has('user', 'id', 9999).as('u')
.addE('rated').from('u').to('m').property('stars', 3)
- 30. マッピングスクリプト
(一部抜粋: 完全なスクリプトは https://gist.github.com/yukim/6cab6f3270d60da3b1604c434e5e092f)
movies = File.text(inputDir + 'movies.dat')
.delimiter("::")
.header('id', 'name', 'genre')
movieInfo = movies.map {
def name = it['name']
def matcher = name =~ /(?<name>.*) ((?<year>d{4}))$/
if (matcher.matches()) {
it['name'] = matcher.group('name')
it['year'] = matcher.group('year').toInteger()
} else {
it['name'] = name
it['year'] = 0
}
it
}
movieload(movieInfo).asVertices {
label 'movie'
key id: 'id'
ignore 'genre'
}
- 33. リコメンデーション
g.V().has('movie', 'name', 'Fight Club')
.inE('rated').has('stars', 5)
.outV()
.has('gender', 'M').has('age', '35')
.outE('rated').has('stars', 5)
.inV()
.has('name', neq('Fight Club'))
.groupCount().by('name')
.unfold()
.order().by(values, decr).limit(10)
// 映画 Fight Club に…
// 星5つをつけている…
// ユーザーで…
// 性別が男、年齢が35の人が…
// 星5つをつけている…
// 映画で…
// 名前がFight Clubでないものを…
// 名前でグループ化してカウントし…
// (展開して)
// 降順で並び替えて最初の10個を取得