เพิ่มประสิทธิภาพการสืบค้น GQL สําหรับกราฟใน Microsoft Fabric

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

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

วางตัวกรองตามความหมายของมัน

วางพรีดิเคตภายในรูปแบบกราฟเมื่อกําหนดว่าโหนดหรือขอบใดสามารถเข้าร่วมการจับคู่ได้ ใช้เงื่อนไขระดับ MATCH ... WHERE คําสั่งเพื่อกรองหลังการจับคู่ที่เสร็จสมบูรณ์ หรือใช้คําสั่งแยกต่างหาก FILTER เมื่อพรีดิเคตใช้กับแถวที่ได้จากคําสั่งก่อนหน้า

ตัวอย่างเช่น ใช้คําสั่งระดับ WHERE รูปแบบสําหรับเงื่อนไขบนโหนดที่ตรงกัน:

MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.id > 1000)
RETURN p.firstName, p.lastName, c.name

แยก FILTER สามารถแสดงเงื่อนไขเดียวกันหลังจากการจับคู่บังคับปกติที่ใช้การค้นหาเส้นทางเริ่มต้น ALL :

MATCH (p:Person)-[:workAt]->(c:Company)
FILTER p.birthday < 19940101 AND c.id > 1000
RETURN p.firstName, p.lastName, c.name

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

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

การวางตําแหน่งก็สําคัญกับ OPTIONAL MATCH, โดยที่อินไลน์ WHERE จะจํากัดการจับคู่ทางเลือก แต่การจับคู่ถัดไป FILTER สามารถลบแถวที่ขยายเป็นศูนย์ได้

เคล็ดลับ

คิดว่าระดับWHEREรูปแบบคล้ายกับเงื่อนไข SQL JOIN ... ON มันอธิบายว่าแมตช์ใดที่ผ่านเกณฑ์ แทนที่จะกรองแถวที่ได้หลังจากนั้น

ส่งคืนเฉพาะคุณสมบัติที่คุณต้องการ

ส่งคืนเฉพาะคุณสมบัติโหนดและเอดจ์ที่สถานการณ์ของคุณต้องการ หลีกเลี่ยงการส่งคืนโหนดแบบเต็มหรือใช้ RETURN * เมื่อคุณต้องการเพียงชุดย่อยของคุณสมบัติ

การเลือกคุณสมบัติที่ไม่จําเป็นจะเพิ่มการอ่านข้อมูล ต้นทุนการออกหมายเลขกํากับ และขนาดการตอบสนอง ในระหว่างการสร้างแบบจําลองกราฟ ให้เลือกเฉพาะคอลัมน์ต้นทางที่คุณต้องการเป็นคุณสมบัติประเภทโหนด

ที่แนะนํา: การฉายภาพที่แคบ

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

หลีกเลี่ยง: การส่งคืนโหนดเต็ม

MATCH (p:Person)-[:workAt]->(c:Company)
RETURN *

Note

เพิ่มคุณสมบัติชนิดโหนดในระหว่างการสร้างแบบจําลองกราฟเมื่อจําเป็นสําหรับการสืบค้นหรือการวิเคราะห์เท่านั้น คุณสมบัติที่น้อยลงต่อโหนดช่วยลดทั้งค่าใช้จ่ายในการ storage และคิวรี

จํากัดขนาดชุดผลลัพธ์

ใช้ LIMIT หรือเงื่อนไขขอบเขตอื่นๆ เมื่อสอบถามโหนดหรือความสัมพันธ์ที่อาจมีคาร์ดินาลลิตี้สูง การจับคู่กราฟที่ไม่มีขอบเขตสามารถสร้างชุดผลลัพธ์ขนาดใหญ่มากที่เข้าใกล้ขีดจํากัดของแพลตฟอร์ม

ที่แนะนํา: ผลลัพธ์ที่มีขอบเขต

MATCH (p:Person)-[:knows]->(friend:Person)
RETURN p.firstName, friend.firstName
LIMIT 1000

หลีกเลี่ยง: การแข่งขันคาร์ดินาลลิตี้สูงที่ไม่มีขอบเขต

MATCH (p:Person)-[:knows]->(friend:Person)
RETURN p.firstName, friend.firstName

สำคัญ

กราฟตัดทอนคําตอบของคําค้นที่มีการแทนค่าไบนารีภายในเกิน 64 MB คําตอบที่ถูกตัดทอนจะมีสถานะเพิ่มเติมพร้อมรหัส 01000 สาธารณะและสถานะ 01M11GQL ที่เป็นมาตรฐาน ใช้ฟิลเตอร์ การฉายภาพแคบ และ LIMIT ลดขนาดผลลัพธ์ สําหรับข้อมูลเพิ่มเติม โปรดดู ข้อจํากัดปัจจุบัน

ให้การสํารวจตื้นและตรงเป้าหมาย

หลีกเลี่ยงรูปแบบกราฟที่ซ้อนกันลึกหรือซับซ้อนมาก ใช้การสํารวจแบบง่ายและตรงเป้าหมายซึ่งตอบคําถามเฉพาะโดยตรง การกระโดดพิเศษแต่ละครั้งในรูปแบบความยาวตัวแปรสามารถเพิ่มจํานวนเส้นทางที่เอ็นจิ้นประเมินได้อย่างทวีคูณ โดยเฉพาะอย่างยิ่งในกราฟที่เชื่อมต่อกันอย่างหนาแน่น

ที่แนะนํา: ขอบเขตที่แน่นหนา

-- Use the narrowest hop range that answers your question
MATCH (p:Person)-[:knows]->{1,3}(friend:Person)
RETURN p.firstName, friend.firstName
LIMIT 1000

หลีกเลี่ยง: ระยะการเคลื่อนที่กว้างโดยไม่มีความจําเป็นชัดเจน

-- A wider range on a dense graph is more expensive
MATCH (p:Person)-[:knows]->{1,8}(friend:Person)
RETURN *

สำคัญ

ตัวสร้างคําสั่งค้นหาแบบภาพจํากัดเส้นทางที่มีความยาวแปรผันไว้ที่แปดก้าว แต่ข้อจํากัดในส่วนติดต่อผู้ใช้นี้ไม่ใช้กับ GQL ในตัวแก้ไขโค้ด ใช้ขอบเขตที่แน่นที่สุดที่สถานการณ์ของคุณอนุญาต เพราะช่วงที่กว้างขึ้นสามารถจับคู่เส้นทางได้มากกว่า

ใช้ TRAIL เมื่อเส้นทางต้องไม่ซ้ํากับขอบ

ใช้ TRAIL โหมดเส้นทางเมื่อเส้นทางที่ถูกต้องต้องไม่ซ้ําขอบ ในกราฟที่มีวงจร ข้อจํากัดนี้ยังสามารถลดจํานวนเส้นทางที่ตรงกันเมื่อเทียบกับโหมดเริ่มต้นWALK

-- TRAIL prevents revisiting the same :knows edge
MATCH TRAIL (src:Person)-[:knows]->{1,4}(dst:Person)
WHERE src.firstName = 'Alice' AND dst.firstName = 'Bob'
RETURN count(*) AS numPaths

หากไม่มี TRAIL, การสืบค้นเดียวกันบนกราฟไซคลิกสามารถส่งคืนเส้นทางที่ซ้ํากับขอบได้ ใช้โหมดที่ตรงกับความหมายของเส้นทางที่ต้องการ แทนที่จะมอง TRAIL ว่าเป็นการเพิ่มประสิทธิภาพทั่วไป

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

ใช้ตัวแปรที่ใช้ร่วมกันเพื่อการรวมที่มีประสิทธิภาพ

เมื่อคิวรีต้องการข้อมูลจากหลายความสัมพันธ์ ให้ใช้ตัวแปรที่ใช้ร่วมกันเพื่อรวมรูปแบบบนเอนทิตีเดียวกัน หากไม่มีตัวแปรที่ใช้ร่วมกัน รูปแบบสามารถสร้างผลิตภัณฑ์คาร์ทีเซียน - ทุกการรวมกันของการจับคู่จากทั้งสองรูปแบบ - นําไปสู่ชุดผลลัพธ์ที่ใหญ่กว่ามาก

ที่แนะนํา: ตัวแปร p ที่ใช้ร่วมกันจะรวมรูปแบบ

-- Single shared variable ensures an efficient join
MATCH (p:Person)-[:workAt]->(c:Company),
      (p)-[:isLocatedIn]->(city:City)
RETURN p.firstName, c.name AS company, city.name AS city
LIMIT 1000

หลีกเลี่ยง: รูปแบบอิสระที่ไม่มีตัวแปรที่ใช้ร่วมกัน

-- Without a shared variable, this produces a cartesian product
MATCH (p1:Person)-[:workAt]->(c:Company),
      (p2:Person)-[:isLocatedIn]->(city:City)
RETURN p1.firstName, c.name, p2.firstName, city.name

ผลิตภัณฑ์คาร์ทีเซียนจับคู่ทุกผลลัพธ์จากรูปแบบหนึ่งกับทุกผลลัพธ์จากอีกรูปแบบหนึ่ง ถ้า Person-workAt->Company ตรงกับ 1,000 แถวและ Person-isLocatedIn->City ตรงกับ 500 แถว แบบสอบถามจะส่งกลับ 1,000 × 500 = 500,000 แถว การเพิ่มตัวแปรที่ใช้ร่วมกันจะจํากัดการรวม ดังนั้นจึงส่งคืนเฉพาะคู่ที่ตรงกัน

กรองคุณสมบัติสําคัญเมื่อระบุโหนด

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

ตัวอย่างเช่น หากประเภทกราฟของคุณกําหนด id เป็นคีย์สําหรับ Person โหนด:

CONSTRAINT person_pk
  FOR (n:Person) REQUIRE n.id IS KEY

จากนั้นกรองเมื่อ id คุณต้องการคนนั้น:

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

หากไม่มีตัวกรอง คําค้นหาจะตรงกับทุก Person โหนดก่อนจะ workAt ผ่านขอบ:

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

เคล็ดลับ

ข้อจํากัดสําคัญจะสร้างเอกลักษณ์และความเป็นเอกลักษณ์ มันไม่ได้รับประกันแผนการค้นหาหรือการสืบค้นแบบกายภาพโดยตรง

เลือกชนิดข้อมูลที่เหมาะสม

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

สําหรับชนิดข้อมูลที่รองรับ โปรดดู ข้อจํากัดปัจจุบัน — ชนิดข้อมูล และ ชนิดคุณสมบัติที่รองรับ

หากเป็นไปได้ ให้ดึงข้อมูลเอนทิตีที่เกี่ยวข้องในรูปแบบกราฟเดียวแทนที่จะออกคิวรีแยกต่างหากที่ข้ามขอบเดียวกันอย่างอิสระ การรวมการสํารวจจะช่วยหลีกเลี่ยงการจับคู่รูปแบบที่ซ้ําซ้อนและป้องกันปัญหาการสืบค้น N+1 โดยที่การสืบค้นเริ่มต้นหนึ่งรายการจะทริกเกอร์การสืบค้นแยกต่างหากสําหรับแต่ละแถวผลลัพธ์

ที่แนะนํา: รูปแบบรวมเดี่ยว

MATCH (c:Customer)-[:purchases]->(o:`Order`)-[:`contains`]->(product:`Product`)
RETURN c.fullName, o, product.productName
LIMIT 1000

หลีกเลี่ยง: คิวรีสองแบบแยกกันที่ข้ามขอบเดียวกันCustomer → Order

-- Query 1: fetch 100 orders
MATCH (c:Customer)-[:purchases]->(o:`Order`)
RETURN c.fullName, o
LIMIT 100

-- Query 2: repeat for each returned order, substituting its key value
MATCH (o:`Order` WHERE o.SalesOrderDetailID_K = 12345)-[:`contains`]->(product:`Product`)
RETURN o, product.productName

ทดสอบการสืบค้นกับปริมาณข้อมูลที่สมจริง

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

  • ชอบรูปร่างคิวรีแบบอนุรักษ์นิยมที่มีตัวกรองและขีดจํากัด
  • หลีกเลี่ยงการสืบค้น "ส่งคืนทุกอย่าง" แบบสํารวจกับกราฟขนาดใหญ่
  • ตรวจสอบระยะเวลาการสืบค้นที่สัมพันธ์กับขีดจํากัดการหมดเวลา 20 นาที