備註
這項功能目前處於公開預覽狀態。 此預覽版是在沒有服務等級協定的情況下提供,不建議用於生產工作負載。 可能不支援特定功能,或可能已經限制功能。 如需詳細資訊,請參閱 Microsoft Azure 預覽版增補使用條款。
圖形模式是 GQL 查詢的核心建置區塊。 它們以直觀、可視化的方式使用節點和邊緣描述您在圖表中尋找的結構。 將圖形模式視為查詢引擎嘗試與圖形中的實際資料進行比對的範本。
這很重要
本文僅使用 社群網路範例圖集。
簡單元素模式
簡單的元素模式可協助您比對圖形中滿足特定需求的個別節點和邊緣。 這些模式構成了更複雜的模式匹配的基礎。
簡單的節點模式
節點型樣會指定節點必須符合的標籤和屬性:
(: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) 組合相同的(:Movie)-[:inspired]->(:Song)邊緣,無論哪個節點是來源,哪個節點是目的地 (此範例不是來自社交網路圖形類型)。
圖形邊緣模式快速鍵
GQL 為常見的邊緣模式提供了方便的捷徑,使您的查詢更加簡潔:
-
()->()代表()-[]->()(帶有任何標籤的定向邊緣) -
()<-()代表()<-[]-()(帶有任何標籤的反向定向邊緣) -
()-()代表()-[]-()(任何有向邊緣與任何標籤)
當您關心連線能力但不關心特定圖形邊緣類型時,這些捷徑會很有用。
標籤運算式
模式可以表達對匹配節點和邊緣標籤的複雜需求。
Example:
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.age > 30 AND p.department = 'Engineering')
-[:workAt]->
(c:Company WHERE c.revenue > 1000000 AND c.location = 'Seattle')
-- Complex edge predicates with calculations
MATCH (p1:Person)-[w:workAt WHERE w.start_date < ZONED_DATETIME('2020-01-01T00:00:00Z')
AND w.salary > 75000]-(c:Company)
-- MATCH WHERE: evaluated after pattern matching
MATCH (p:Person)-[:workAt]->(c:Company)
WHERE p.active = TRUE AND c.public = TRUE
-- Filter during matching and after
MATCH (p:Person WHERE p.department = 'Sales')-[:workAt]->(c:Company)
WHERE p.quota_achievement > 1.2 AND c.revenue > c.revenue_target
小提示
當條件具有高度選擇性時,使用型樣述詞可以減少中間結果的大小。
繫結路徑變數
您也可以將相符的路徑繫結至路徑變數,以進行進一步處理,或將完整的路徑結構傳回給使用者:
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)
此模式會同時尋找一個人及其教育、就業和內容偏好,這是全面的設定檔查詢。
匹配軌跡
在複雜的模式中,通常不希望多次遍歷相同的邊緣。 當實際圖形包含可能導致無限或過長路徑的循環時,邊緣重複使用變得很重要。 若要處理邊緣重複使用,Microsoft Fabric 中的圖形支援 TRAIL 比對模式。
在路徑模式前面加上關鍵字 TRAIL 會捨棄多次繫結相同邊緣的所有相符專案:
TRAIL (a)-[e1:knows]->(b)-[e2:knows]->(c)-[e3:knows]->(d)
透過使用 TRAIL,模式只會產生所有邊都不同的相符項目。 因此,即使路徑在給定的匹配中形成一個循環,c = a也e3永遠不會綁定到與 相同的e1邊緣。
此 TRAIL 模式對於防止無限迴圈並確保您的查詢傳回有意義的非冗餘路徑至關重要。
使用可變長度模式
可變長度模式是強大的結構,可讓您找到不同長度的路徑,而無需編寫重複的模式規範。 它們對於穿越等級制度、社交網路和其他事先不知道最佳路徑長度的結構至關重要。
有界限的可變長度模式
這很重要
有界可變長度形態目前僅支援最大上限 8。 請參閱有關當前 限制的文章。
許多常見的圖形查詢需要多次重複相同的邊緣模式。 而不是編寫冗長的模式,例如:
(:Person)-[:knows]->(:Person)-[:knows]->(:Person)-[:knows]->(:Person)
您可以使用更簡潔的可變長度語法:
(:Person)-[:knows]->{3}(:Person)
指定{3}-[:knows]->邊緣模式應精確重複三次。
靈活的重複範圍: 為了提高靈活性,您可以同時指定重複的下限和上限:
(:Person)-[:knows]->{1, 3}(:Person)
此模式會在單一查詢中尋找直接朋友、朋友的朋友和朋友的朋友。
備註
下限也可以是 0。 在此情況下,不會相符任何邊緣,且只有當且僅當兩個端點節點型樣符合相同的節點時,整個型樣才會相符。
範例:
(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)
這個模式會配對彼此認識的不同人, 也能 同時匹配同一個人, p1p2 即使那個人自己並不「認識」。
如果未指定下限,通常預設為 0 (零)。
複雜可變長度組合: 可變長度的模式可以是更大、更複雜模式的一部分,如以下查詢所示:
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
該模式會找到一對評論,其中彼此認識的人喜歡不同的評論,這些評論通過每個評論 1-5 級的回复鏈連接起來。
繫結可變長度型樣邊緣變數
繫結可變長度邊緣模式時,邊緣變數的值和類型會根據參考前後關聯而變更。 了解此行為對於正確處理可變長度匹配至關重要:
兩個參考度:
- 在可變長度模式內:圖形邊緣變數沿著匹配的路徑綁定到每個單獨的邊緣(也稱為「單例參考度」)
- 在可變長度模式之外:圖形邊緣變數會繫結至相符路徑上所有邊緣的順序 (也稱為「群組參照度」)
示範這兩個內容的範例:
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
更多細節請參閱 水平聚合 章節。