次の方法で共有


graph-match 演算子

適用対象: ✅Microsoft FabricAzure データ エクスプローラーAzure MonitorMicrosoft Sentinel

graph-match演算子は、入力グラフ ソース内のグラフ パターンのすべての出現箇所を検索します。

この演算子は、make-graph 演算子と共に使用されます。

構文

G|graph-match [cycles=CyclesOption] Pattern [whereConstraints] project [ColumnName=] [, ...]

パラメーター

名前 タイプ 必須 説明
G string ✔️ 入力グラフ ソース。
パターン string ✔️ グラフ表記を使用して、グラフ エッジ要素によって接続されたグラフ ノード要素の 1 つ以上のコンマ区切りシーケンス。 「グラフ パターン表記」を参照してください。
制約 string パターン内の名前付き変数のプロパティで構成されるブール式。 各グラフ要素 (ノード/エッジ) には、グラフの構築中にアタッチされた一連のプロパティがあります。 制約によって、パターンで一致する要素 (ノードとエッジ) が定義されます。 プロパティは、変数名の後にドット (.) とプロパティ名が続いて参照されます。
string ✔️ project句は、各パターンを表形式の結果の行に変換します。 プロジェクト式は、 Pattern で定義されている名前付き変数のスカラー プロパティと参照プロパティである必要があります。 プロパティは、変数名の後にドット (.) と属性名が続いて参照されます。
CyclesOption string パターン、許可される値 (allnoneunique_edges) でサイクルが一致するかどうかを制御します。 allが指定されている場合、すべてのサイクルが一致し、none指定されたサイクルが一致しない場合、unique_edges (既定値) が指定されている場合、サイクルは一致しますが、サイクルに同じエッジが複数回含まれていない場合にのみ一致します。

グラフ パターン表記

次の表に、サポートされているグラフ表記を示します。

要素 名前付き変数 アノニマス
ノード ( n) ()
向きエッジ: 左から右へ -[ e]-> -->
方向付きエッジ: 右から左へ <-[ e]- <--
任意の方向エッジ -[ e]- --
可変長エッジ -[ e*3..5]- -[*3..5]-

可変長エッジ

可変長エッジを使用すると、定義された制限内で特定のパターンを複数回繰り返すことができます。 この種類のエッジは、アスタリスク (*) で示され、その後に min..max 形式の最小値と最大値が続きます。 最小値と最大値はどちらも 整数 スカラーである必要があります。 シーケンス内のすべてのエッジが、 where 句で説明されている制約を満たしている場合、この出現範囲内にあるエッジのシーケンスは、パターンの可変エッジと一致する可能性があります。

複数のシーケンス

非線形パターンを表現するには、複数のコンマ区切りシーケンスが使用されます。 異なるシーケンス間の接続を記述するには、ノードの 1 つ以上の変数名を共有する必要があります。 たとえば、ノード abcd に接続された中心にノード n を持つ星パターンを表すには、次のパターンを使用できます。

( a)--(n)--(b),(c)--(n)--(d)

1 つの接続されたコンポーネント パターンのみがサポートされます。

返品ポリシー

graph-match演算子は表形式の結果を返します。各レコードはグラフ内のパターンの一致に対応します。
返される列は、パターンで定義されたエッジやノードのプロパティを使用して、演算子の project 句で定義されます。 可変長エッジのプロパティと関数は動的配列として返され、配列内の各値は可変長エッジの出現に対応します。

例示

次の例は、組織の階層を表しています。 ここでは、可変長エッジを使用して、階層のさまざまなレベルの従業員を 1 つのクエリで検索する方法を示します。 グラフ内のノードは従業員を表し、エッジは従業員から上司までです。 make-graphを使用してグラフを作成した後、Aliceより若い30の組織の従業員を検索します。

let employees = datatable(name:string, age:long) 
[ 
  "Alice", 32,  
  "Bob", 31,  
  "Eve", 27,  
  "Joe", 29,  
  "Chris", 45, 
  "Alex", 35,
  "Ben", 23,
  "Richard", 39,
]; 
let reports = datatable(employee:string, manager:string) 
[ 
  "Bob", "Alice",  
  "Chris", "Alice",  
  "Eve", "Bob",
  "Ben", "Chris",
  "Joe", "Alice", 
  "Richard", "Bob"
]; 
reports 
| make-graph employee --> manager with employees on name 
| graph-match (alice)<-[reports*1..5]-(employee)
  where alice.name == "Alice" and employee.age < 30
  project employee = employee.name, age = employee.age, reportingPath = map(reports, manager)

出力

使用人 年齢 reportingPath
ジョー 二十九 [
"Alice"
]
前夜祭 二十七 [
"Alice",
"Bob"
]
ベン 23 [
"Alice",
"Chris"
]

次の例では、 Actions テーブルと Entities テーブルからグラフを作成します。 エンティティは人とシステムであり、アクションはエンティティ間のさまざまな関係を記述します。 グラフを構築する make-graph オペレーターの後に、graph-match システムへの攻撃パスを検索するグラフ パターンを使用して"Apollo"を呼び出します。

let Entities = datatable(name:string, type:string, age:long) 
[ 
  "Alice", "Person", 23,  
  "Bob", "Person", 31,  
  "Eve", "Person", 17,  
  "Mallory", "Person", 29,  
  "Apollo", "System", 99 
]; 
let Actions = datatable(source:string, destination:string, action_type:string) 
[ 
  "Alice", "Bob", "communicatesWith",  
  "Alice", "Apollo", "trusts",  
  "Bob", "Apollo", "hasPermission",  
  "Eve", "Alice", "attacks",  
  "Mallory", "Alice", "attacks",  
  "Mallory", "Bob", "attacks"  
]; 
Actions 
| make-graph source --> destination with Entities on name 
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(apollo) 
  where mallory.name == "Mallory" and apollo.name == "Apollo" and attacks.action_type == "attacks" and hasPermission.action_type == "hasPermission" 
  project Attacker = mallory.name, Compromised = compromised.name, System = apollo.name

出力

攻撃者 セキュリティ侵害 システム
Mallory ボブ アポロ

次の例は前の攻撃パスの例と似ていますが、追加の制約があります。侵害されたエンティティも Alice と通信する必要があります。 graph-match パターン プレフィックスは前の例と同じであり、侵害されたシーケンスをシーケンス間のリンクとして別のシーケンスを追加します。

let Entities = datatable(name:string, type:string, age:long) 
[ 
  "Alice", "Person", 23,  
  "Bob", "Person", 31,  
  "Eve", "Person", 17,  
  "Mallory", "Person", 29,  
  "Apollo", "System", 99 
]; 
let Actions = datatable(source:string, destination:string, action_type:string) 
[ 
  "Alice", "Bob", "communicatesWith",  
  "Alice", "Apollo", "trusts",  
  "Bob", "Apollo", "hasPermission",  
  "Eve", "Alice", "attacks",  
  "Mallory", "Alice", "attacks",  
  "Mallory", "Bob", "attacks"  
]; 
Actions 
| make-graph source --> destination with Entities on name 
| graph-match (mallory)-[attacks]->(compromised)-[hasPermission]->(apollo), (compromised)-[communicates]-(alice) 
  where mallory.name == "Mallory" and apollo.name == "Apollo" and attacks.action_type == "attacks" and hasPermission.action_type == "hasPermission" and alice.name == "Alice"
  project Attacker = mallory.name, Compromised = compromised.name, System = apollo.name

出力

攻撃者 セキュリティ侵害 システム
Mallory ボブ アポロ