หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
Note
คุณลักษณะนี้อยู่ในการแสดงตัวอย่างสาธารณะ การแสดงตัวอย่างนี้จะมีให้โดยไม่มีข้อตกลงระดับบริการ และไม่แนะนําสําหรับปริมาณงานการผลิต คุณลักษณะบางอย่างอาจไม่ได้รับการสนับสนุนหรืออาจมีความสามารถที่จํากัด สําหรับข้อมูลเพิ่มเติม ให้ดู เงื่อนไขเพิ่มเติมของการใช้สําหรับการแสดงตัวอย่าง Microsoft Azure
รูปแบบกราฟเป็นบล็อกการสร้างหลักของคิวรี GQL ของคุณ ซึ่งอธิบายโครงสร้างที่คุณกําลังค้นหาในกราฟโดยใช้โหนดและขอบในลักษณะที่ใช้งานง่ายและการแสดงผลด้วยภาพ ให้คิดว่ารูปแบบกราฟเป็นเทมเพลตที่กลไกจัดการคิวรีพยายามจับคู่กับข้อมูลจริงในกราฟของคุณ
สําคัญ
บทความนี้ใช้ชุดข้อมูลกราฟตัวอย่างเครือข่ายสังคมโดยเฉพาะ
รูปแบบองค์ประกอบอย่างง่าย
รูปแบบองค์ประกอบแบบง่ายช่วยให้คุณจับคู่โหนดและขอบแต่ละอันจากกราฟของคุณที่ตรงตามข้อกําหนดเฉพาะ รูปแบบเหล่านี้จะสร้างพื้นฐานสําหรับการจับคู่รูปแบบที่ซับซ้อนมากขึ้น
รูปแบบโหนดอย่างง่าย
รูปแบบโหนดระบุป้ายชื่อและคุณสมบัติที่โหนดต้องตรงกัน:
(:City { name: "New York" })
รูปแบบนี้ตรงกับโหนดทั้งหมดที่มีทั้งPlaceป้ายชื่อ และ City (ระบุโดยตัว&ดําเนินการ) และnameที่มีคุณสมบัติ เท่ากับ"New York" ข้อมูลจําเพาะของป้ายชื่อและคุณสมบัติที่จําเป็นนี้เรียกว่า ฟิลเลอร์ ของรูปแบบโหนด
แนวคิดหลัก:
-
การจับคู่ป้ายชื่อ: ใช้
&เพื่อกําหนดป้ายชื่อหลายป้าย - การกรองคุณสมบัติ: ระบุค่าที่แน่นอนซึ่งคุณสมบัติต้องตรงกัน
- การจับคู่แบบยืดหยุ่น ("covariant") : โหนดที่ตรงกันสามารถมีป้ายชื่อและคุณสมบัติมากกว่าที่ระบุได้
Note
โมเดลกราฟที่มีป้ายกํากับหลายองค์ประกอบยังไม่ได้รับการสนับสนุน (ปัญหาที่ทราบแล้ว)
รูปแบบขอบอย่างง่าย
รูปแบบขอบจะซับซ้อนมากกว่ารูปแบบโหนด พวกเขาไม่เพียงระบุฟิลเลอร์ แต่ยังเชื่อมต่อรูปแบบโหนดต้นทางกับรูปแบบโหนดปลายทาง รูปแบบขอบอธิบายข้อกําหนดทั้งบนขอบและจุดสิ้นสุด:
(: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 มีทางลัดที่สะดวกสําหรับรูปแบบขอบทั่วไปเพื่อให้คิวรีของคุณกระชับยิ่งขึ้น:
-
()->()ย่อมาจาก()-[]->()(ขอบที่กํากับด้วยป้ายชื่อใด ๆ) -
()<-()ย่อมาจาก()<-[]-()(ขอบตรงในด้านหลังที่มีป้ายชื่อใด ๆ) -
()-()ย่อมาจาก()-[]-()(ขอบที่มีป้ายชื่อใดก็ได้)
ทางลัดเหล่านี้จะเป็นประโยชน์เมื่อคุณสนใจเกี่ยวกับการเชื่อมต่อ แต่ไม่เกี่ยวกับชนิดขอบกราฟที่เฉพาะเจาะจง
นิพจน์ป้ายชื่อ
รูปแบบสามารถแสดงข้อกําหนดที่ซับซ้อนบนป้ายชื่อของโหนดและขอบที่ตรงกัน
ตัวอย่าง:
MATCH (:Person|(Organization&!Company))-[:isLocatedIn]->(p:City|Country)
RETURN count(*) AS num_matches
นับจํานวน isLocatedIn ขอบที่เชื่อมต่อ Person โหนดหรือ Organizationโหนด -but-not-Company (ซึ่งมักจะ University เป็นโหนดใน schema เครือข่ายทางสังคม) ไปยัง City หรือ Country โหนด
วากยสัมพันธ์:
| วากยสัมพันธ์ | ความหมาย |
|---|---|
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)
รูปแบบ edge ค้นหาบุคคลที่รู้จักกันตั้งแต่วันที่ 1 มกราคม 2000 โดยใช้เงื่อนไขที่ยืดหยุ่นมากกว่าการจับคู่ที่แน่นอน
Note
ตัวแปรรูปแบบขอบผูกกับขอบแต่ละขอบในเพรดิเคตรูปแบบขอบเสมอแม้ว่าคุณจะใช้รูปแบบความยาวตัวแปรก็ตาม ซึ่งสามารถช่วยในการไม่ต้องไม่สรรหาตัวแปรรายการกลุ่มขอบเพื่อดําเนินการหลังตัวกรองได้ ดูที่ ผูกตัวแปรของขอบรูปแบบความยาวตัวแปร
เทคนิคเพรดิเคตรูปแบบขั้นสูง:
เพรดิเคตรูปแบบให้ความสามารถในการกรองแบบอินไลน์ที่มีประสิทธิภาพซึ่งสามารถปรับปรุงความสามารถในการอ่านคิวรีได้:
-- 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
รูปแบบการเรียบเรียง
คิวรีในโลกแห่งความเป็นจริงมักต้องการรูปแบบที่ซับซ้อนมากกว่าโครงสร้าง node-edge แบบง่าย 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)
รูปแบบนี้ค้นหาเพื่อนโดยตรงเพื่อนของเพื่อนและเพื่อน - เพื่อนของเพื่อนทั้งหมดในการคิวรีเดียว
Note
นอกจากนี้ ขอบเขตด้านล่างยังสามารถเป็น 0ได้ด้วย ในกรณีนี้ จะไม่มีการจับคู่ขอบและรูปแบบทั้งหมดจะจับคู่ก็ต่อเมื่อรูปแบบโหนดปลายทางทั้งสองตรงกับโหนดเดียวกันเท่านั้น
ตัวอย่าง:
(p1:Person)-[r:knows WHERE NOT p1=p2]->{0,1}(p2:Person)
รูปแบบนี้ตรงกับคู่ของบุคคลต่าง ๆ ที่รู้จักกัน แต่ยัง ตรงกับบุคคลเดียวกันกับทั้งคู่ p1 และ p2 - แม้ว่าบุคคลนั้นจะไม่ "รู้จัก" ตัวเองก็ตาม
เมื่อไม่ได้ระบุขอบเขตที่ต่ํากว่า โดยทั่วไปแล้วจะใช้ค่าเริ่มต้นเป็น 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 ระดับ
ตัวแปรขอบรูปแบบความยาวตัวแปรผูก
เมื่อคุณผูกรูปแบบขอบความยาวตัวแปร ค่าและชนิดของตัวแปรขอบจะเปลี่ยนแปลงโดยขึ้นอยู่กับบริบทการอ้างอิง การทําความเข้าใจลักษณะการทํางานนี้เป็นสิ่งสําคัญสําหรับการจับคู่การประมวลผลความยาวตัวแปรอย่างถูกต้อง:
การอ้างอิงสององศา:
- ภายในรูปแบบความยาวตัวแปร: ตัวแปรขอบกราฟที่ผูกกับแต่ละขอบตามเส้นทางที่ตรงกัน (หรือที่เรียกว่า "ระดับการอ้างอิงแบบ singleton")
- ภายนอกรูปแบบความยาวตัวแปร: ตัวแปรขอบกราฟผูกกับลําดับของขอบทั้งหมดตามเส้นทางที่ตรงกัน (หรือที่เรียกว่า "ระดับกลุ่มของการอ้างอิง")
ตัวอย่างที่สาธิตบริบททั้งสอง:
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]คือค่าการอ้างอิงขอบแรกในแต่ละห่วงโซ่ที่ตรงกัน
ตัวแปรขอบรูปแบบความยาวตัวแปรในการรวมแนวนอน:
ตัวแปร Edge ที่ผูกไว้ด้วยการจับคู่รูปแบบความยาวตัวแปรคือรายการกลุ่มที่อยู่นอกรูปแบบความยาวตัวแปร ดังนั้นจึงสามารถใช้ในการรวมแนวนอนได้
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
ดูส่วนการ รวม แนวนอนสําหรับรายละเอียดเพิ่มเติม