เขียนคิวรี GQL ทั่วไปใน Microsoft Fabric

Note

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

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

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

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

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

ค้นหาเพื่อนบ้านโดยตรง

ส่งคืนโหนดทั้งหมดที่เชื่อมต่อกับโหนดเริ่มต้นด้วยหนึ่งฮ็อป

ค้นหาทุกคนที่บุคคลใดบุคคลหนึ่งรู้จัก:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:knows]->(friend:Person)
RETURN friend.firstName, friend.lastName

ค้นหาบริษัททั้งหมดที่บุคคลนั้นทํางาน:

MATCH (p:Person WHERE p.firstName = 'Alice')-[:workAt]->(c:Company)
RETURN c.name, c.url

ค้นหาเพื่อนของเพื่อน (มัลติฮอป)

ใช้รูปแบบความยาวตัวแปรเพื่อ {min,max} สํารวจมากกว่าหนึ่งกระโดด

ค้นหาผู้คนที่อยู่ห่างออกไปสองกระโดด - เพื่อนของเพื่อนของอลิซที่อลิซไม่รู้จักโดยตรง:

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

ค้นหาทุกคนที่สามารถเข้าถึงได้ภายในสามองศา:

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

Tip

ตั้งค่าขอบเขตบนในการเคลื่อนที่แบบปรับความยาวได้เสมอ รูปแบบที่ไม่มีขอบเขตในกราฟขนาดใหญ่หรือหนาแน่นอาจถึงขีดจํากัดการหมดเวลาของคิวรี ดูข้อจํากัดปัจจุบัน

นับความสัมพันธ์ต่อเอนทิตี

ใช้ GROUP BY with count(*) เพื่อนับจํานวนความสัมพันธ์ที่แต่ละเอนทิตีมี

นับจํานวนเพื่อนที่แต่ละคนมี โดยเรียงลําดับจากมากไปน้อย:

MATCH (p:Person)-[:knows]->(friend:Person)
LET name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY name
ORDER BY friendCount DESC
LIMIT 20

นับจํานวนพนักงานที่ทํางานในแต่ละบริษัท:

MATCH (p:Person)-[:workAt]->(c:Company)
LET companyName = c.name
RETURN companyName, count(*) AS employeeCount
GROUP BY companyName
ORDER BY employeeCount DESC

ค้นหาการเชื่อมต่อที่แชร์

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

ค้นหาคู่ของคนที่รู้จักคนเดียวกัน:

MATCH (a:Person)-[:knows]->(mutual:Person)<-[:knows]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, mutual.firstName AS sharedContact
LIMIT 100

ค้นหาคู่คนที่ทํางานในบริษัทเดียวกัน:

MATCH (c:Company)<-[:workAt]-(a:Person), (c)<-[:workAt]-(b:Person)
WHERE a.id < b.id
RETURN a.firstName, b.firstName, c.name AS company
LIMIT 100

Tip

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

ค้นหาเอนทิตีที่ไม่มีความสัมพันธ์

ใช้ OPTIONAL MATCH ตามด้วยการตรวจสอบ Null เพื่อค้นหาโหนดที่ไม่มีความสัมพันธ์ที่ตรงกัน

ค้นหาคนที่ไม่ได้ทํางานในบริษัทใด ๆ :

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

ค้นหาโพสต์ที่ไม่มีความคิดเห็น:

MATCH (post:Post)
OPTIONAL MATCH (comment:Comment)-[:replyOf]->(post)
FILTER comment IS NULL
RETURN post.id, post.content
LIMIT 100

ค้นหาเอนทิตีที่มีการเชื่อมต่อจํานวนมาก

รวม GROUP BY และ FILTER เพื่อระบุโหนดที่เชื่อมต่อกันสูง วิธีนี้มีประโยชน์สําหรับการค้นหาฮับหรือค่าผิดปกติ

ค้นหาผู้คนที่มีเพื่อนมากกว่า 10 คน:

MATCH (p:Person)-[:knows]->(friend:Person)
LET name = p.firstName || ' ' || p.lastName
RETURN name, count(*) AS friendCount
GROUP BY name
FILTER friendCount > 10
ORDER BY friendCount DESC

Note

FILTER หลังจาก GROUP BY ทํางานเหมือน HAVING ใน SQL กรองผลลัพธ์แบบรวม ไม่ใช่แต่ละแถว