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