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