แชร์ผ่าน


รูปแบบกราฟ GQL

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

ดูส่วนการ รวม แนวนอนสําหรับรายละเอียดเพิ่มเติม