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

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

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

ใช้บทความนี้เพื่อเรียนรู้วิธีสร้างและรวมรูปแบบโหนด ขอบ และเส้นทาง สําหรับงานที่พร้อมใช้งาน เช่น การค้นหาเพื่อนบ้านหรือเอนทิตีที่ไม่มีความสัมพันธ์ ดูที่ การเขียนคําสั่ง 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 ภายในรูปแบบเมื่อเงื่อนไขกําหนดว่าโหนดหรือขอบใดสามารถเข้าร่วมแมตช์ได้ ใช้เงื่อนไขระดับ MATCH ... WHERE คําสั่งเพื่อกรองหลังการจับคู่ที่เสร็จสมบูรณ์ หรือ FILTER ใช้แยกต่างหากเมื่อเงื่อนไขนั้นใช้กับแถวที่ได้จากคําสั่งก่อนหน้า การวางตําแหน่งของนิพจน์สามารถเปลี่ยนผลลัพธ์ของเส้นทางที่สั้นที่สุดได้ สําหรับข้อมูลเพิ่มเติม ดูที่ Place predicates ก่อนหรือหลังการเลือกเส้นทาง

ตัวอย่างเช่น หากต้องการค้นหาผู้ที่เกิดก่อนปี 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 ใช้ WALK, ซึ่งอนุญาตให้โหนดและขอบซ้ําได้ ใช้โหมดเส้นทางอื่นเมื่อคุณต้องการความเป็นเอกลักษณ์ขององค์ประกอบที่เข้มงวดขึ้น

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

WALK เป็นโหมดที่อนุญาตมากที่สุดและ ACYCLIC เข้มงวดที่สุด

สําหรับ SIMPLE และ ACYCLIC, ความเป็นเอกลักษณ์ของขอบจะมาจากความเป็นเอกลักษณ์ของโหนด SIMPLEเส้นทางสามารถปิดได้โดยกลับไปยังโหนดแรก แต่ก็ยังไม่สามารถใช้ขอบซ้ําได้

เพื่อแสดงให้เห็นถึงความแตกต่าง ให้พิจารณาเส้นทางของ 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)
LET personId = dst.id
RETURN personId, dst.firstName, dst.lastName, count(*) AS pathCount
GROUP BY personId, dst.firstName, dst.lastName
ORDER BY pathCount DESC
LIMIT 100

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

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

โหมดจับคู่เริ่มต้น REPEATABLE ELEMENTS อนุญาตให้ใช้ขอบซ้ําโดยเส้นทางแยกกันในรูปแบบกราฟเดียวกัน การใช้งาน DIFFERENT EDGES หรือ DIFFERENT RELATIONSHIPS เมื่อทุกการผูกขอบในทุกเส้นทางต้องแตกต่างกัน:

MATCH DIFFERENT EDGES
  (p:Person)-[:knows]->(friend:Person),
  (p)-[:knows]->(other:Person)
RETURN p.firstName, friend.firstName, other.firstName
LIMIT 100

ส่งคืนเส้นทางที่สั้นที่สุดหนึ่งเส้นทาง

ALL เป็นการค้นหาเส้นทางเริ่มต้นและคืนค่าเส้นทางที่ตรงกันทุกเส้นทาง ใช้เพื่อ ANY SHORTEST คืนเส้นทางที่สั้นที่สุดหนึ่งเส้นทางสําหรับแต่ละคู่ต้นทาง-ปลายทาง คําค้นหาต่อไปนี้พบเส้นทางที่สั้นที่สุดจาก Alice ไปยัง Bob:

MATCH p = ANY SHORTEST
  (src:Person WHERE src.firstName = 'Alice')-[:knows]->{1,4}
  (dst:Person WHERE dst.firstName = 'Bob')
RETURN p, path_length(p) AS hopCount

เมื่อเส้นทางที่สั้นที่สุดหลายเส้นเท่ากัน เส้นทางใดที่คืนกลับไม่ใช่เส้นทางที่กําหนดแน่นอน ALL SHORTEST และ ANY การค้นหาเส้นทางไม่รองรับ

การวางตัวนิพจน์สามารถเปลี่ยนผลลัพธ์ของANY SHORTEST เงื่อนไขโหนดและขอบแบบอินไลน์จะจํากัดเส้นทางที่มีสิทธิ์ ในขณะที่ postfilter สามารถลบเส้นทางที่เลือกได้โดยไม่ต้องเลือกเส้นทางที่ยาวกว่าแทน ดูที่ พจน์ Place ก่อนหรือหลังการเลือกเส้นทาง

Tip

ควรเลือกขอบเขตบนที่จํากัดสําหรับต้นทุนการสืบค้นที่คาดการณ์ได้ รูปแบบที่ไม่จํากัด ALL WALK ไม่รองรับ รูปแบบที่ไม่มีขอบเขตที่มี TRAIL, SIMPLE, หรือ ACYCLIC สิ้นสุดด้วยความเป็นเอกลักษณ์ขององค์ประกอบ แต่ยังสามารถคืนเส้นทางได้หลายเส้นทาง Unbounded ANY SHORTEST WALK รองรับเฉพาะรูปร่างคําสั่งค้นหาบางประเภทเท่านั้น ดูข้อจํากัดปัจจุบัน

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

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

ตัวอย่างเช่น หากต้องการค้นหาคนที่รู้จักกันและทํางานในบริษัทเดียวกันได้ถึง 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