SQL Server 2017 からはじめる
Graph データベース
プログラミング生放送勉強会 第49回@大阪 +
わんくま同盟 大阪勉強会 #71
2017/11/18 SQLWorld お だ
自己紹介
織田 信亮(おだ しんすけ)
大阪で開発者しています
SQLWorld の代表です
http://odashinsuke.hatenablog.com/
Twitter:@shinsukeoda
今日のゴール
Graph ってなに?
SQL Server でも試してみるかー
SQL Server 2017
Microsoft が出してる RDBMS
最新版の 2017 が10月にリリース
DB エンジン以外にも、色々な機能がある
Integration Services
Reporting Services
Analysis Services
ML Services
…
https://www.microsoft.com/ja-jp/sql-server/sql-server-2017
Graph って何?
Graph って何?
Node
vertex (頂点)
エンティティ
Edge
releationship
2つの Node を繋ぐ
Property
Node、Edge の属性
Property の例
もうちょっと詳しく
Node Table
Node を表すテーブル
create table グラフ_会場 (
名称 nvarchar(20) not null primary key
) as node
Edge Table
Edge を表すテーブル
create table グラフ_利用 as Edge
データの追加 (Node Table)
insert into グラフ_会場
values (N'MS関西支店')
insert into グラフ_会場 (名称)
values (N'エムオーテックス新大阪ビル')
データの追加 (Edge Table)
INSERT の構文
insert into <table>
values (<from_node_id>, <to_node_id>, val1, val2, ...)
insert into <table> ($from_id, $to_id, col1, col2, ...)
values (<from_node_id>, <to_node_id>, val1, val2, ...)
データの追加 (Edge Table)
insert into グラフ_利用 values (
(select $node_id from グラフ_勉強会 where 名称 = N'プロ生第42回')
, (select $node_id from グラフ_会場 where 名称 = N'MS関西支店')
)
データの検索 (MATCH)
select グラフ_勉強会.名称, グラフ_会場.名称
from グラフ_勉強会, グラフ_利用, グラフ_会場
where match (グラフ_勉強会 - (グラフ_利用) -> グラフ_会場)
データの検索 (MATCH)
MATCH の構文
[node] : Node テーブル or エイリアス
[edge] : Edge テーブル or エイリアス
match ( [node] - ([edge]) -> [node] )
match ( [node] <- ([edge]) - [node] )
match ( [node] - ([edge]) -> [node] - ([edge]) -> [node] )
match ( [node] - ([edge]) -> [node] <- ([edge]) - [node] )
match ( [node] - ([edge]) -> [node] and [node] - ([edge]) -> [node] )
データの検索 (NOT EXISTS)
MATCH は NOT / OR と一緒に使えない
select [誰さん].[名前] as [誰々さんが], [好きな人].[名前] as [好きな人]
from [人] [誰さん], [好き], [人] [好きな人]
where match ([誰さん] - ([好き]) -> [好きな人])
and not exists (
select * from [好き] [nest]
where match ([誰さん] <- ([nest]) - [好きな人])
)
DEMO
Graph データを
触ってみる
どこで使う?
階層構造なデータ
HyerarchyID でも出来るが、親が複数ある
等は、HyerarchyID では実現出来ない
複雑な多対多
相互につながった関係を分析する
どこで使う?
最短経路
SNS、CRM、CMS
レコメンド
不正検知
サンプル紹介
レコメンド
Graph extensions in Microsoft SQL Server 2017 and Azure SQL Database
https://myignite.microsoft.com/videos/55108
制限事項
テンポラリテーブル では使えない
テーブル 変数でも使えない
メモリ最適化テーブルに出来ない
Edge テーブルの UPDATE で $from_id,
$to_id を更新出来ない
クロスデータベースクエリは未サポート
$from_id, $to_id に特定の Node のみを
許可する制限は出来ない
まとめ
Node と Edge(繋がり)の集まり
SQL Server でも使えるようになった!
複雑な繋がりをシンプルなクエリで表現
SQL Server に統合されているので、SQL
Server の他の機能と合わせて使える
参考資料
Graph processing with SQL Server and Azure SQL
Database
https://docs.microsoft.com/en-us/sql/relational-
databases/graphs/sql-graph-overview
SQL Graph Architecture
https://docs.microsoft.com/en-us/sql/relational-
databases/graphs/sql-graph-architecture
CREATE TABLE (SQL Graph)
https://docs.microsoft.com/en-us/sql/t-
sql/statements/create-table-sql-graph
参考資料
INSERT (SQL Graph)
https://docs.microsoft.com/en-us/sql/t-
sql/statements/insert-sql-graph
MATCH (Transact-SQL)
https://docs.microsoft.com/en-us/sql/t-sql/queries/match-
sql-graph
SQL Server 2017 Graph Database Example
https://www.mssqltips.com/sqlservertip/4883/sql-server-
2017-graph-database-example/

Sql server 2017 からはじめる graph データベース