MATCH (Transact-SQL)
適用対象: SQL Server 2017 (14.x) 以降 Azure SQL データベース Azure SQL Managed Instance
グラフの検索条件を指定します。 MATCH は、WHERE 句の一部として、SELECT ステートメントでグラフ ノードとエッジのテーブルでのみ使用できます。
構文
MATCH (<graph_search_pattern>)
<graph_search_pattern>::=
{
<simple_match_pattern>
| <arbitrary_length_match_pattern>
| <arbitrary_length_match_last_node_predicate>
}
<simple_match_pattern>::=
{
LAST_NODE(<node_alias>) | <node_alias> {
{ <-( <edge_alias> )- }
| { -( <edge_alias> )-> }
<node_alias> | LAST_NODE(<node_alias>)
}
}
[ { AND } { ( <simple_match_pattern> ) } ]
[ ,...n ]
<node_alias> ::=
node_table_name | node_table_alias
<edge_alias> ::=
edge_table_name | edge_table_alias
<arbitrary_length_match_pattern> ::=
{
SHORTEST_PATH(
<arbitrary_length_pattern>
[ { AND } { <arbitrary_length_pattern> } ]
[ ,…n]
)
}
<arbitrary_length_match_last_node_predicate> ::=
{ LAST_NODE( <node_alias> ) = LAST_NODE( <node_alias> ) }
<arbitrary_length_pattern> ::=
{ LAST_NODE( <node_alias> ) | <node_alias>
( <edge_first_al_pattern> [<edge_first_al_pattern>…,n] )
<al_pattern_quantifier>
}
| ( {<node_first_al_pattern> [<node_first_al_pattern> …,n] )
<al_pattern_quantifier>
LAST_NODE( <node_alias> ) | <node_alias>
}
<edge_first_al_pattern> ::=
{ (
{ -( <edge_alias> )-> }
| { <-( <edge_alias> )- }
<node_alias>
)
}
<node_first_al_pattern> ::=
{ (
<node_alias>
{ <-( <edge_alias> )- }
| { -( <edge_alias> )-> }
)
}
<al_pattern_quantifier> ::=
{
+
| { 1 , n }
}
n - positive integer only.
引数
graph_search_pattern
グラフでの検索パターンまたは走査するパスを指定します。 このパターンは、グラフでパスを走査するために ASCII アート構文を使用します。 このパターンは、提供される矢印の方向でエッジを使用して 1 つのノードから別のノードに移動します。 エッジ名またはエイリアスは、かっこ内に表示されます。 ノード名またはエイリアスは、矢印の 2 つの端に表示されます。 矢印は、パターンのいずれの方向に移動できます。
node_alias
FROM 句で指定されたノード テーブルの名前またはエイリアス。
edge_alias
FROM 句で指定されたエッジ テーブルの名前またはエイリアス。
SHORTEST_PATH 最短パス関数は、グラフ内の特定の 2 つのノード間、またはグラフ内の特定のノードと他のすべてのノード間の、最短パスを探すために使用されます。 入力として任意の長さのパターンを受け取り、グラフ内でそれが繰り返し検索されます。 SQL Server 2019 で導入されました。 SQL Server 2019 以降を必要とします。
arbitrary_length_match_pattern
目的のノードに到達するまで、またはパターンで指定されている繰り返しの最大数が満たされるまで、繰り返しトラバースする必要があるノードとエッジを指定します。
al_pattern_quantifier
任意の長さのパターンでは、特定の検索パターンの繰り返し回数を指定するため、正規表現スタイルのパターン量指定子を受け取ります。 サポートされている検索パターン量指定子は次のとおりです。
- + :パターンを 1 回以上繰り返します。 最短パスが見つかったらすぐに終了します。
- {1,n}: パターンを 1 から n 回繰り返します。 最短パスが見つかったらすぐに終了します。
解説
MATCH 内のノード名は繰り返すことができます。 つまり、ノードは、同じクエリ内でノードは任意の回数走査できます。
エッジ名は MATCH 内では繰り返すことはできません。
エッジは、いずれの方向もポイントできますが、明示的な方向が必要です。
MATCH パターンでは、OR および NOT 演算子はサポートされていません。
MATCH は、AND と WHERE 句を使用して他の式と組み合わせることができます。 ただし、OR または NOT を使用して他の式と組み合わせることはサポートされていません。
例
A. 友達の検索
次の例では、Person ノード テーブルと friend エッジ テーブルを作成し、いくつかデータを挿入し、MATCH を使用して、グラフの Alice の友人を検索します。
-- Create person node table
CREATE TABLE dbo.Person (ID INTEGER PRIMARY KEY, name VARCHAR(50)) AS NODE;
CREATE TABLE dbo.friend (start_date DATE) AS EDGE;
-- Insert into node table
INSERT INTO dbo.Person VALUES (1, 'Alice');
INSERT INTO dbo.Person VALUES (2,'John');
INSERT INTO dbo.Person VALUES (3, 'Jacob');
-- Insert into edge table
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'Alice'),
(SELECT $node_id FROM dbo.Person WHERE name = 'John'), '9/15/2011');
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'Alice'),
(SELECT $node_id FROM dbo.Person WHERE name = 'Jacob'), '10/15/2011');
INSERT INTO dbo.friend VALUES ((SELECT $node_id FROM dbo.Person WHERE name = 'John'),
(SELECT $node_id FROM dbo.Person WHERE name = 'Jacob'), '10/15/2012');
-- use MATCH in SELECT to find friends of Alice
SELECT Person2.name AS FriendName
FROM Person Person1, friend, Person Person2
WHERE MATCH(Person1-(friend)->Person2)
AND Person1.name = 'Alice';
B. 友人の友人の検索
次の例では、Alice の友人の友人の検索を試行します。
SELECT Person3.name AS FriendName
FROM Person Person1, friend, Person Person2, friend friend2, Person Person3
WHERE MATCH(Person1-(friend)->Person2-(friend2)->Person3)
AND Person1.name = 'Alice';
C. その他の MATCH
パターン
MATCH 内でパターンを指定する他のいくつかの方法を次に示します。
-- Find a friend
SELECT Person2.name AS FriendName
FROM Person Person1, friend, Person Person2
WHERE MATCH(Person1-(friend)->Person2);
-- The pattern can also be expressed as below
SELECT Person2.name AS FriendName
FROM Person Person1, friend, Person Person2
WHERE MATCH(Person2<-(friend)-Person1);
-- Find 2 people who are both friends with same person
SELECT Person1.name AS Friend1, Person2.name AS Friend2
FROM Person Person1, friend friend1, Person Person2,
friend friend2, Person Person0
WHERE MATCH(Person1-(friend1)->Person0<-(friend2)-Person2);
-- this pattern can also be expressed as below
SELECT Person1.name AS Friend1, Person2.name AS Friend2
FROM Person Person1, friend friend1, Person Person2,
friend friend2, Person Person0
WHERE MATCH(Person1-(friend1)->Person0 AND Person2-(friend2)->Person0);
参照
CREATE TABLE (SQL Graph)
INSERT (SQL グラフ)
SQL Server 2017 でのグラフ処理