圖圖模式是你在 Microsoft Fabric 中圖形中進行 GQL 查詢的核心建構組件。 它們以直觀、可視化的方式使用節點和邊緣描述您在圖表中尋找的結構。 將圖形模式視為查詢引擎嘗試與圖形中的實際資料進行比對的範本。
本文說明 GQL 中圖型的語法與組合規則。
這很重要
本文僅使用 社群網路範例圖集。
簡單元素模式
簡單的元素模式可協助您比對圖形中滿足特定需求的個別節點和邊緣。 這些模式構成了更複雜的模式匹配的基礎。
簡單的節點模式
節點型樣會指定節點必須符合的標籤和屬性:
(:Place&City { name: "New York" })
此型樣會比對 同時具有 和PlaceCity 標籤 (由 & 運算子指出) 且其 name 屬性等於 "New York"的所有節點。 這種所需標籤與屬性的組合稱為節點模式的填充。
關鍵概念:
-
標籤比對:用於
&要求多個標籤。 - 屬性篩選:指定屬性必須相符的確切值。
- 彈性 (「共變」) 比對:相符的節點可以具有超出指定標籤和屬性的更多標籤和屬性。
備註
節點可以有多個標籤,但帶有多個標籤的邊型還不支援。
簡單的邊緣圖案
邊緣模式比節點模式更複雜。 它們不僅指定填充器,還會將原節點模式與目標節點模式連接起來。 Edge 模式描述 Edge 及其端點上的需求:
(:Person)-[:likes|knows { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]->(:Comment)
箭頭方向 -[...]-> 很重要——它決定 (:Person) 了原點節點的圖案和 (:Comment) 目標節點的圖案。 了解邊緣方向對於正確查詢圖表至關重要。
對等鏡像模式:
您可以翻轉箭頭並交換節點樣式,以建立對等的鏡射邊緣樣式:
(:Comment)<-[:likes { creationDate: ZONED_DATETIME("2010-08-31T13:16:54Z") }]-(:Person)
這種模式找到相同的關係,但從相反的角度。
任何定向邊緣模式
當圖形邊緣的方向對您的查詢無關時,您可以透過建立任何有向邊緣模式來將其保留為未指定:
(:Song)-[:inspired]-(:Movie)
這個模式與 和 (:Song)-[:inspired]->(:Movie) combined 的邊(:Movie)-[:inspired]->(:Song)匹配相同,無論哪個節點是原點、哪個是目標(此範例並非來自社交網路圖型)。
圖形邊緣模式快速鍵
GQL 為常見的邊緣模式提供了方便的捷徑,使您的查詢更加簡潔:
-
()->()代表()-[]->()(帶有任何標籤的定向邊緣) -
()<-()代表()<-[]-()(帶有任何標籤的反向定向邊緣) -
()-()代表()-[]-()(任何有向邊緣與任何標籤)
當您關心連線能力但不關心特定圖形邊緣類型時,這些捷徑會很有用。
標籤運算式
模式可以表達對匹配節點和邊緣標籤的複雜需求。
範例:
MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches
這會計算連接節點或isLocatedIn節點(但PersonOrganization不是節點Company)到 University 或 節點City的邊緣數量Country。
Syntax:
| 語法 | Meaning |
|---|---|
A&B |
標籤必須同時包含 A 和 B。 |
A|B |
標籤必須至少包含 A 或 B 中的一個。 |
!A |
標籤需要排除 A。 |
此外,使用括弧來控制標籤運算式評估的順序。 依預設,具有 ! 最高的優先順序, & 且優先順序高於 |。 因此 !A&B|C|!D 與 ((!A)&B)|C|(!D)相同。
繫結變數
變數可讓您在查詢的其他部分參考相符的圖形元素。 了解如何綁定和使用變數對於建立強大的查詢至關重要。
繫結元素變數
節點和邊緣模式都可以將匹配的節點和邊緣綁定到變數以供以後參考。
(p:Person)-[w:workAt]->(c:Company)
在此模式中, p 繫結至相符節點 Person 、 w 相符邊 workAt 及 c 相符 Company 節點。
結構約束的變數重複使用:
在模式中多次重複使用相同的變數表示對匹配結構的限制。 每次出現相同變數都必須一律系結至有效相符項目中的相同圖形元素。 變數重複使用對於表達複雜的結構需求非常強大。
(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
模式會尋找Person節點,且x節點彼此認識並在同一y位置工作,該節點Company繫結至變數 c。 重複 c 使用可確保兩個人在同一家公司工作。
具有元素變數的模式述詞:
繫結元素變數可讓您指定節點和邊緣型樣述詞。 填充器不僅可以提供具有精確屬性值的 { name: "New York, USA" }填充器,例如 ,還可以指定針對每個候選元素評估的述詞。 只有在述詞評估為 TRUE:
(p:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T18:00:00Z")]-(o:Person)
邊緣模式會使用彈性條件,而不是完全相符來尋找自 2000 年 1 月 1 日以來彼此認識的人。
備註
邊緣型樣變數一律系結至邊緣型樣述詞中的個別邊,即使使用可變長度型樣也一樣。 這有助於不必取消巢狀邊緣群組清單變數來執行後置篩選。 請參閱 繫結可變長度型樣邊緣變數。
進階型樣謂詞技術:
模式述詞提供了強大的內聯過濾功能,可以提高查詢的可讀性:
-- Multiple conditions in node predicates
MATCH (p:Person WHERE p.birthday < 19900101 AND p.gender = 'female')
-[:workAt]->
(c:Company WHERE c.name STARTS WITH 'A')
-- Filter on an edge property
MATCH (p1:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.browserUsed = 'Firefox' AND c.name IS NOT NULL
-- Filter during matching and after
MATCH (p:Person WHERE p.gender = 'male')-[:workAt]->(c:Company)
WHERE p.birthday < 19900101 AND c.url IS NOT NULL
小提示
當描述哪個節點或邊可以參與配對時,在圖樣中保留一個謂詞。
繫結路徑變數
您也可以將相符的路徑繫結至路徑變數,以進行進一步處理,或將完整的路徑結構傳回給使用者:
p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
這裡,綁 p 定到代表完整匹配路徑結構的路徑值,包括按給定順序所有節點和邊緣的參考值。
綁定路徑可以回傳給使用者,或透過像 NODES 或 EDGES這樣的函式進一步處理:
MATCH p=(c:Company)<-[:workAt]-(x:Person)-[:knows]-(y:Person)-[:workAt]->(c:Company)
LET path_edges = edges(p)
RETURN path_edges, size(path_edges) AS num_edges
GROUP BY path_edges
撰寫模式
現實世界的查詢通常需要比簡單的節點-邊緣-節點結構更複雜的模式。 GQL 提供了幾種方法來撰寫複雜的圖遍歷的模式。
撰寫路徑模式
路徑模式可以透過串連簡單的節點和邊緣模式來組成,以建立更長的遍歷。
(:Person)-[:knows]->(:Person)-[:workAt]->(:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
這種模式從一個人開始,通過他們的社交和專業關係,找到他們同事的公司所在的位置。
分段圖案建構: 您也可以以更漸進的方式建立路徑模式,這可以使複雜的模式更易於閱讀和理解:
(:Person)-[:knows]->(p:Person),
(p:Person)-[:workAt]->(c:Company),
(c:Company)-[:isLocatedIn]->(:Country)-[:isPartOf]->(:Continent)
這種方法將相同的遍歷分解為邏輯步驟,使其更易於理解和調試。
撰寫非線性模式
圖樣的產生形狀不一定是線性路徑。 您可以匹配更複雜的結構,例如從中心節點輻射的“星形”圖案:
(p:Person),
(p)-[:studyAt]->(u:University),
(p)-[:workAt]->(c:Company),
(p)-[:likes]-(m)
此模式會同時尋找一個人及其教育、就業和內容偏好,這是全面的設定檔查詢。
同 MATCH 一個模式不一定要共享變數。 不連貫的圖案形成它們匹配的笛卡兒積。 當模式應該綁定相同的圖形元素,且只保留連接組合時,請重複使用變數。
控制元件重用
GQL 控制重複節點與邊的兩個層級:
- 匹配模式適用於完整的圖形模式,包括逗號分隔路徑。
- 路徑模式適用於一條路徑。
預設的配對模式為 REPEATABLE ELEMENTS。 它允許相同的元素綁定發生在圖樣的不同部分,並受每條路徑的路徑模式影響。 你可以明確寫道:
REPEATABLE ELEMENTS (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
使用 DIFFERENT EDGES 或其同義 DIFFERENT RELATIONSHIPS 詞要求整個圖樣中邊的唯一性。 此匹配模式也會改變模式中任何 WALK 行為 TRAIL 路徑。
DIFFERENT EDGES (a)-[e1:knows]->(b), (a)-[e2:knows]->(c)
以下路徑模式控制每條路徑中的重複元素:
| 路徑模式 | 元素重用 |
|---|---|
WALK |
節點和邊可以重複。 |
TRAIL |
邊不能重複,但節點可以重複。 |
SIMPLE |
節點不能重複,除了第一個和最後一個節點可以相同。 邊緣無法重複。 |
ACYCLIC |
節點不能重複,包括第一個和最後一個節點。 邊緣無法重複。 |
WALK 是預設的路徑模式。 當你需要更嚴格元素唯一性時,會用另一種模式作為路徑前綴:
對於 SIMPLE 和 ACYCLIC,邊唯一性可由節點唯一性推導出。
SIMPLE路徑可以透過返回第一個節點來封閉,但仍無法重複使用邊。
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
該TRAIL模式僅產生 、 e2、 e3 與 不同的匹配e1。 節點仍可重複,因此路徑可形成循環而不重複使用邊。
控制回傳路徑
路徑搜尋前綴控制路徑模式回傳的路徑。 預設 ALL 前綴會回傳所有符合路徑模式與模式的路徑。 你可以明確寫 ALL 道:
ALL TRAIL (a:Person)-[:knows]->{1,4}(b:Person)
使用 ANY SHORTEST 以回傳每個輸入列中每個來源-目的地對的最短匹配路徑:
MATCH p = ANY SHORTEST
(src:Person)-[:knows]->{1,4}(dst:Person)
RETURN src.id AS sourceId, dst.id AS targetId, path_length(p) AS hopCount
ORDER BY sourceId, targetId
LIMIT 100
如果多條路徑因最短長度而平手,查詢會回傳其中一條,但回傳的是哪條並列路徑並非確定性。 下界為零可以回傳從來源節點到自身的零跳路徑。
ALL SHORTEST
ANY而且不支援路徑搜尋。
將謂詞置於路徑選擇前或後
謂詞擺放決定條件是否定義合格路徑,或是在路徑搜尋前綴選擇路徑後篩選:
- 節點或邊形中的內列
WHERE線是該線路的一部分。 它限制了哪些路徑在適用前ALLANY SHORTEST或被應用時符合資格。 - 完整
MATCH模式之後的語句層WHERE級稱為後濾波器。 它會在路徑搜尋前綴選取路徑後,過濾各列。 - 後續
FILTER的陳述也會在路徑選擇後過濾列。
此 ANY SHORTEST區分在 時尤為重要。 在以下模式中,只有 knows 在指定日期或之後建立的邊在查詢選擇最短路徑時才有資格:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')
-[connection:knows
WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z')]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
RETURN p
將邊緣條件移到後濾波器會改變其意義。 查詢首先選擇一條沒有該條件的最短路徑。 如果有任何邊不符合條件,它會移除所選路徑;它不會選擇較長的路徑:
MATCH p = ANY SHORTEST
(src:Person WHERE src.firstName = 'Alice')
-[connections:knows]->{1,4}
(dst:Person WHERE dst.firstName = 'Bob')
FILTER ALL(connection IN connections
WHERE connection.creationDate >= ZONED_DATETIME('2020-01-01T00:00:00Z'))
RETURN p
這很重要
對於某些 ANY SHORTEST 查詢形狀,Graph 目前可以在路徑選擇前套用語句層 MATCH ... WHERE 級條件。 在此限制解決前,請使用內嵌謂詞作為路徑資格,並使用獨立 FILTER 的敘述來進行後選拔過濾。 如需詳細資訊,請參閱目前的限制。
使用可變長度模式
可變長度模式是強大的結構,可讓您找到不同長度的路徑,而無需編寫重複的模式規範。 它們對於穿越等級制度、社交網路和其他事先不知道最佳路徑長度的結構至關重要。
有界限的可變長度模式
許多常見的圖形查詢需要多次重複相同的邊緣模式。 而不是編寫冗長的模式,例如:
(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)
您可以使用更簡潔的可變長度語法:
(:Person)-[:knows]->{3}(:Person)
指定{3}-[:knows]->邊緣模式應精確重複三次。
靈活的重複範圍: 為了提高靈活性,您可以同時指定重複的下限和上限:
(:Person)-[:knows]->{1, 3}(:Person)
此模式會在單一查詢中尋找直接朋友、朋友的朋友和朋友的朋友。
備註
下界也可以是零。 零跳匹配不包含邊,且需要兩個端點節點模式都匹配同一節點。
Example:
(p1:Person)-[:knows]->{0,1}(p2:Person)
此模式在零跳點匹配每個人p1p2,並在一跳匹配連接的配對。
當 中 {,n}未指定下界時,預設為零。
複雜可變長度組合: 可變長度的模式可以是更大、更複雜模式的一部分,如以下查詢所示:
MATCH (c1:Comment)<-[:likes]-(p1:Person)-[:knows]-(p2:Person)-[:likes]->(c2:Comment),
(c1:Comment)<-[:replyOf]-{1,3}(m)-[:replyOf]->{1,3}(c2:Comment)
RETURN *
LIMIT 100
這個模式會找到成對的留言,彼此認識的人按讚了不同的留言,並且每則留 m 言都以一條一到三 replyOf 條邊的鏈條連結訊息。
繫結可變長度型樣邊緣變數
繫結可變長度邊緣模式時,邊緣變數的值和類型會根據參考前後關聯而變更。 了解此行為對於正確處理可變長度匹配至關重要:
兩個參考度:
- 在可變長度模式內:圖形邊緣變數沿著匹配的路徑綁定到每個單獨的邊緣(也稱為「單例參考度」)
- 在可變長度模式之外:圖形邊緣變數會繫結至相符路徑上所有邊緣的順序 (也稱為「群組參照度」)
示範這兩個內容的範例:
MATCH (:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}()
RETURN e[0]
LIMIT 100
邊緣變數 e 的評估發生在兩個環境定義中:
在聲明中
MATCH:查詢查找自 2000 年以來建立的朋友鏈,其中每個友誼都是建立的。 在模式比對期間,邊緣模式述詞e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")會針對每個候選邊緣評估一次。 在此內容中,繫e結至單一邊參考值。在陳述式中
RETURN:這裡,e按照它們在匹配鏈中出現的順序綁定到邊緣參考值的(組)列表。 的e[0]結果是每個相符鏈中的第一個邊參考值。
水平聚合中的可變長度圖案邊變數:
由變長模式匹配綁定的邊緣變數是位於變長模式之外的群組列表,因此可用於水平聚合。
MATCH (a:Person)-[e:knows WHERE e.creationDate >= ZONED_DATETIME("2000-01-01T00:00:00Z")]->{1,3}(b)
RETURN a, b, size(e) AS num_edges
LIMIT 100
欲了解更多資訊,請參閱 「聚合函數」。
無界限可變長度模式
當未知最大路徑長度時,使用無界量詞:
-- Two or more edges
TRAIL (:Person)-[:knows]->{2,}(:Person)
*與 + 捷徑指定零次或多個重複次數與一次或多個重複:
-- Zero or more edges
ACYCLIC (:Person)-[:knows]->*(:Person)
-- One or more edges
SIMPLE (:Person)-[:knows]->+(:Person)
預設 ALL WALK 組合為無界模式會被拒絕,因為循環可產生無限多條匹配路徑。 使用 TRAIL、 SIMPLE、 或 ACYCLIC 來將路徑界定為邊或節點唯一性。 這些模式保證終止,但大型圖仍可能產生大量路徑。
這很重要
對於由無界 ANY SHORTEST WALK所界定的路徑,唯一被支持的用途為 PATH_LENGTH(path) 和 ,與之並列的 path IS NULL。 圖並不代表完整路徑。 使用有限上界或指定 TRAIL、 , SIMPLE或 ACYCLIC 返回或以其他方式使用路徑。