เขียนคิวรีรูปแบบกราฟใน Microsoft Fabric

Note

คุณลักษณะนี้อยู่ในการแสดงตัวอย่างสาธารณะ การแสดงตัวอย่างนี้จะมีให้โดยไม่มีข้อตกลงระดับบริการ และไม่แนะนําสําหรับปริมาณงานการผลิต คุณลักษณะบางอย่างอาจไม่ได้รับการสนับสนุนหรืออาจมีความสามารถที่จํากัด สําหรับข้อมูลเพิ่มเติม โปรดดู ข้อกําหนดการใช้งานเพิ่มเติมสําหรับตัวอย่าง Microsoft Azure

การจับคู่รูปแบบกราฟช่วยให้คุณอธิบายโครงสร้างของข้อมูลที่คุณต้องการค้นหาโดยใช้ไวยากรณ์ที่ใช้งานง่าย แทนที่จะรวมตาราง คุณเขียนรูปแบบที่ดูเหมือนความสัมพันธ์ - โหนดที่เชื่อมต่อกันด้วยขอบ บทความนี้แสดงวิธีการเขียนแบบสอบถามรูปแบบ GQL สําหรับสถานการณ์ทั่วไปในกราฟใน Microsoft Fabric

ตัวอย่างใช้ชุดข้อมูลตัวอย่างเครือข่ายสังคม สําหรับการอ้างอิงไวยากรณ์รูปแบบแบบเต็ม โปรดดูรูปแบบกราฟ GQL

ข้อกำหนดเบื้องต้น

  • รายการกราฟที่มีข้อมูลที่โหลด หากคุณยังใหม่กับกราฟ ให้ทําบท ช่วยสอน ให้เสร็จก่อน
  • ความคุ้นเคยกับพื้นฐาน MATCH และ RETURN แบบสอบถาม ดูคู่มือภาษา GQL

จับคู่ความสัมพันธ์โดยตรง

รูปแบบพื้นฐานตรงกับประเภทโหนด ประเภทขอบเฉพาะ และประเภทโหนดอื่น ไวยากรณ์มีลักษณะเหมือนไดอะแกรมของความสัมพันธ์

ตัวอย่างเช่น หากต้องการค้นหาคนสูงสุด 100 คนที่จับคู่กับบริษัทที่พวกเขาทํางานอยู่:

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name
LIMIT 100

ใช้รูปแบบขอบที่ไม่มีทิศทางเมื่อคุณไม่ทราบหรือไม่สนใจทิศทาง ตัวอย่างเช่น หากต้องการค้นหาคนรู้จักร่วมกันสูงสุด 100 คน โดยไม่คํานึงถึงว่าใครเป็นผู้ริเริ่มการเชื่อมต่อ:

MATCH (a:Person)-[:knows]-(b:Person)
RETURN a.firstName, b.firstName
LIMIT 100

Note

ขณะนี้กราฟไม่สนับสนุนการสร้างขอบที่ไม่มีทิศทาง แต่คุณสามารถสืบค้นขอบในทิศทางใดก็ได้โดยใช้ -[:label]- ไวยากรณ์

กรองรูปแบบด้วย WHERE แบบอินไลน์

วาง WHERE ภายในรูปแบบเพื่อกรองโหนดและขอบตามที่ตรงกัน วิธีนี้มีประสิทธิภาพมากกว่าการกรองหลังจากข้อเท็จจริง

ตัวอย่างเช่น หากต้องการค้นหาผู้ที่เกิดก่อนปี 1990 ที่ทํางานในบริษัทที่มีชื่อขึ้นต้นด้วย 'A' ให้ทําดังนี้

MATCH (p:Person WHERE p.birthday < 19900101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name

กรองคุณสมบัติขอบเพื่อจํากัดความสัมพันธ์ที่ตรงกัน ตัวอย่างเช่น หากต้องการส่งคืนเฉพาะผู้ที่เริ่มทํางานในบริษัทในปี 2010 หรือหลังจากนั้น ให้ทําดังนี้

MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2010]->(c:Company)
RETURN p.firstName, c.name, w.workFrom

จับคู่ความสัมพันธ์แบบหลายฮอป

ใช้รูปแบบความยาวตัวแปรเพื่อสํารวจหลายฮ็อปในนิพจน์เดียว ระบุจํานวนฮ็อพต่ําสุดและสูงสุดด้วย {min,max} ไวยากรณ์

ตัวอย่างเช่น หากต้องการค้นหาผู้คนที่สามารถเข้าถึงได้มากถึง 100 คนภายในสองถึงสี่องศาของมิตรภาพจากอลิซ:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{2,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

หากต้องการค้นหาการเชื่อมต่อทันทีและระดับที่สองมากถึง 100 รายการ (หนึ่งหรือสองฮ็อป) จาก Alice:

MATCH (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,2}(dst:Person)
RETURN DISTINCT dst.firstName, dst.lastName
LIMIT 100

ควบคุมการเคลื่อนที่ด้วยโหมดเส้นทาง

โดยค่าเริ่มต้น GQL จะใช้ TRAIL โหมด ซึ่งจะป้องกันไม่ให้ข้ามขอบเดียวกันมากกว่าหนึ่งครั้ง ใช้โหมดเส้นทางอย่างชัดเจนเมื่อคุณต้องการการรับประกันที่แตกต่างกัน

โหมดเส้นทาง พฤติกรรม ใช้เมื่อ...
WALK อนุญาตให้ใช้โหนดและขอบซ้ํา คุณต้องการการเดินทางแบบดิบโดยไม่มีข้อจํากัด ไม่ค่อยจําเป็น มีประโยชน์เป็นหลักสําหรับการสืบค้นเชิงสํารวจ
TRAIL ไม่มีขอบซ้ํา (ค่าเริ่มต้น) คุณต้องการหลีกเลี่ยงการย้อนกลับความสัมพันธ์เดียวกัน แต่โหนดเดียวกันสามารถปรากฏผ่านความสัมพันธ์ที่แตกต่างกัน ทํางานได้ดีสําหรับคิวรีการสํารวจส่วนใหญ่
SIMPLE ไม่มีโหนดซ้ํา ยกเว้นเริ่มต้นและสิ้นสุด คุณต้องการให้โหนดไม่ปรากฏมากกว่าหนึ่งครั้งตรงกลางของเส้นทาง แต่อนุญาตให้มีเส้นทางที่ปิดกลับไปยังจุดเริ่มต้น มีประโยชน์สําหรับการตรวจจับลูป
ACYCLIC ไม่มีโหนดซ้ําเลย คุณต้องรับประกันว่าไม่มีโหนดใดปรากฏที่ใดก็ได้ในเส้นทางมากกว่าหนึ่งครั้ง ใช้สําหรับลําดับชั้นที่เข้มงวด สายข้อมูล หรือการสํารวจใดๆ ที่การกลับมาดูโหนดอีกครั้งจะให้ผลลัพธ์ที่ไม่ถูกต้อง

WALK เป็นโหมดที่อนุญาตมากที่สุดและ ACYCLIC เข้มงวดที่สุด TRAIL เป็นค่าเริ่มต้นและทํางานได้ดีสําหรับคิวรีส่วนใหญ่ ใช้โหมดที่เข้มงวดมากขึ้นเฉพาะเมื่อกรณีการใช้งานของคุณต้องการเท่านั้น

เพื่อแสดงให้เห็นถึงความแตกต่าง ให้พิจารณาเส้นทางของ Alice → Bob → Carol → Bob:

  • เดิน — อนุญาตให้มีเส้นทางนี้ โหนดและขอบสามารถทําซ้ําได้อย่างอิสระ
  • TRAIL — อนุญาตให้มีเส้นทางนี้ บ็อบปรากฏสองครั้ง แต่แต่ละขอบที่ใช้เป็นความสัมพันธ์ที่แตกต่างกัน (อลิซ→บ็อบและแครอล→บ็อบเป็นขอบที่แตกต่างกัน) ดังนั้นจึงไม่มีขอบซ้ํากัน
  • ง่าย — ปิดกั้นเส้นทางนี้ Bob ปรากฏมากกว่าหนึ่งครั้ง และ SIMPLE อนุญาตให้โหนดทําซ้ําได้ก็ต่อเมื่อเป็นทั้งจุดเริ่มต้นและจุดสิ้นสุดของเส้นทาง (รอบปิด) ที่นี่อลิซเป็นจุดเริ่มต้นและบ็อบคือจุดจบดังนั้นจึงไม่มีข้อยกเว้น
  • ACYCLIC — ปิดกั้นเส้นทางนี้ บ็อบปรากฏตัวมากกว่าหนึ่งครั้งที่ใดก็ได้ในเส้นทาง

ตัวอย่างต่อไปนี้แสดงวิธีใช้เพื่อนับ TRAIL จํานวนเส้นทางที่แตกต่างกันที่นําไปสู่ผู้คน 100 คนแรกที่สามารถเข้าถึงได้ในเครือข่ายของ Alice ภายใน 4 hops:

MATCH TRAIL (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName, count(*) AS pathCount
LIMIT 100

ใช้เพื่อ ACYCLIC ส่งคืนได้ถึง 100 คนที่สามารถเข้าถึงได้จากอลิซภายในสี่กระโดด โดยที่แต่ละคนในเส้นทางนั้นไม่ซ้ํากัน:

MATCH ACYCLIC (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}(dst:Person)
RETURN dst.firstName, dst.lastName
LIMIT 100

Tip

สําหรับกราฟขนาดใหญ่ ให้ตั้งค่าขอบเขตบนในรูปแบบความยาวตัวแปรเสมอ ({1,4} แทนที่จะเป็น {1,}) การสํารวจแบบไม่จํากัดในกราฟหนาแน่นอาจถึงขีดจํากัดการหมดเวลาของคิวรี ดูข้อจํากัดปัจจุบัน

ใช้ตัวแปรซ้ําเพื่อแสดงเอนทิตีที่ใช้ร่วมกัน

การนําตัวแปรเดียวกันกลับมาใช้ใหม่ในสองส่วนของรูปแบบจะสร้างข้อจํากัดความเท่าเทียมกันโดยปริยาย - การอ้างอิงทั้งสองต้องตรงกับโหนดเดียวกัน เทคนิคนี้ช่วยให้คุณแสดง "ค้นหาเอนทิตีที่เชื่อมต่อผ่านเอนทิตีที่สามที่ใช้ร่วมกัน"

ตัวอย่างเช่น หากต้องการค้นหาคนที่รู้จักกันและทํางานในบริษัทเดียวกันได้ถึง 100 คู่ ให้ทําดังนี้

MATCH (c:Company)<-[:workAt]-(a:Person)-[:knows]-(b:Person)-[:workAt]->(c)
RETURN a.firstName, b.firstName, c.name
LIMIT 100

ตัวแป c รจะถูกนํามาใช้ซ้ําสําหรับทั้งสอง workAt เป้าหมาย ดังนั้นแบบสอบถามจะส่งกลับเฉพาะคู่ที่ทั้งสองคนรู้จักกัน และ ทํางานในบริษัทเดียวกัน

วิธีค้นหาผู้คนสูงสุด 100 คู่ที่ทั้งคู่ถูกใจโพสต์เดียวกัน

MATCH (a:Person)-[:likes]->(post:Post)<-[:likes]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, post.id
LIMIT 100

Tip

เงื่อนไขนี้ WHERE a.id < b.id ป้องกันไม่ให้คู่ที่ซ้ํากัน (อลิซ + บ็อบ และบ็อบ + อลิซ) ปรากฏในผลลัพธ์

รวมหลายรูปแบบ

แสดงรายการหลายรูปแบบในครั้งเดียว MATCHคั่นด้วยเครื่องหมายจุลภาค รูปแบบทั้งหมดต้องใช้ตัวแปรร่วมกันอย่างน้อยหนึ่งตัวเพื่อให้รวมกันได้อย่างถูกต้อง

ตัวอย่างเช่น หากต้องการค้นหาผู้คนสูงสุด 100 คน พร้อมกับทั้งที่ทํางานและเมืองที่พวกเขาอาศัยอยู่:

MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 100

ตัวแปร p ที่ใช้ร่วมกันเชื่อมต่อทั้งสองรูปแบบ แต่ละแถวผลลัพธ์แสดงถึงบุคคลหนึ่งคนที่มีบริษัทและเมืองของตน

จับคู่ความสัมพันธ์ที่ไม่บังคับ

ใช้ OPTIONAL MATCH เมื่อความสัมพันธ์อาจไม่มีอยู่สําหรับทุกโหนด แถวที่ไม่มีการจับคู่จะถูกเก็บไว้ด้วย NULL ค่า คล้ายกับ SQL LEFT JOIN.

ตัวอย่างเช่น ส่งคืนบุคคลที่มีชื่อบริษัทได้สูงสุด 100 คน รวมถึงผู้ที่ไม่มีนายจ้าง (นั่นคือ ผู้ที่กลับมา NULL ในคอลัมน์บริษัท):

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
RETURN p.firstName, p.lastName, c.name AS company
LIMIT 100

ใช้ IS NULL After OPTIONAL MATCH เพื่อค้นหาคนที่ไม่ได้ทํางานในบริษัทใดๆ ได้สูงสุด 100 คน ดังนี้

MATCH (p:Person)
OPTIONAL MATCH (p)-[:workAt]->(c:Company)
FILTER c IS NULL
RETURN p.firstName, p.lastName
LIMIT 100