หมายเหตุ
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลอง ลงชื่อเข้าใช้หรือเปลี่ยนไดเรกทอรีได้
การเข้าถึงหน้านี้ต้องได้รับการอนุญาต คุณสามารถลองเปลี่ยนไดเรกทอรีได้
การกรองจะจํากัดผลลัพธ์ให้แคบลงเป็นแถวที่สําคัญ การรวมจะสรุปแถวเหล่านั้นเป็นจํานวน ผลรวม และค่าเฉลี่ย บทความนี้แสดงวิธีการใช้เทคนิคทั้งสองในคิวรี GQL กับกราฟใน Microsoft Fabric
ตัวอย่างใช้ชุดข้อมูลตัวอย่างเครือข่ายสังคม สําหรับคําอธิบายแบบครบวงจรเกี่ยวกับการไหลของคําสั่งและคําสั่งของคําสั่ง โปรดดูคู่มือภาษา GQL
ใช้บทความนี้สําหรับการกรองแถวและรูปแบบ การรวมกลุ่มและไม่รวมกลุ่ม ตัวกรองเฉพาะกลุ่ม และการกําหนดเส้นทางแบบมีเงื่อนไข สําหรับการสร้างรูปแบบหลายจุดและเลือกเส้นทาง ดูที่ การเขียนคําสั่งค้นหารูปแบบกราฟ สําหรับงานธุรกิจที่พร้อมใช้งาน ดูที่ การเขียนคําสั่ง GQL ทั่วไป
ข้อกำหนดเบื้องต้น
- รายการกราฟที่สร้างจากชุดข้อมูลตัวอย่างเครือข่ายสังคม โดยมีประเภทโหนด ประเภทขอบ และคุณสมบัติที่อธิบายไว้ในตัวอย่างสคีมาเครือข่ายสังคม
- ความคุ้นเคยกับพื้นฐาน
MATCHและRETURNแบบสอบถาม ดูคู่มือภาษา GQL
กรองแถวด้วย FILTER
ใช้เพื่อ FILTER เก็บเฉพาะแถวที่ตรงตามเงื่อนไข วาง FILTER หลังจาก MATCH เพื่อจํากัดผลลัพธ์ที่ตรงกันให้แคบลง
แบบสอบถามต่อไปนี้จะส่งกลับผู้หญิงทั้งหมดพร้อมชื่อและวันเกิด
MATCH (p:Person)
FILTER p.gender = 'female'
RETURN p.firstName, p.lastName, p.birthday
รวมหลายเงื่อนไขกับ AND และ OR. ตัวอย่างเช่น แบบสอบถามต่อไปนี้ส่งกลับชื่อของผู้หญิงทั้งหมดที่เกิดก่อนปี 1990:
MATCH (p:Person)
FILTER p.gender = 'female' AND p.birthday < 19900101
RETURN p.firstName, p.lastName
Tip
ใช้คําสั่งอินไลน์ WHERE เมื่อเงื่อนไขกําหนดว่าโหนดหรือขอบใดสามารถเข้าร่วมการจับคู่ได้ ใช้ FILTER เมื่อเงื่อนไขนั้นใช้กับแถวที่เกิดจากคําสั่งก่อนหน้า การวางตําแหน่งของนิพจน์สามารถเปลี่ยนผลลัพธ์ของเส้นทางที่สั้นที่สุดได้;ดูที่ วางนิพจน์ก่อนหรือหลังการเลือกเส้นทาง
กรองระหว่างการจับคู่รูปแบบ
อินไลน์ WHERE clause ภายใน MATCH แพทเทิร์นจะจํากัดว่าโหนดและขอบใดจะมีสิทธิ์จับคู่ ตัวปรับแต่งคําสั่งคําค้นสามารถใช้พรีดิเคตที่เทียบเท่ากันในระหว่างการสแกน ดังนั้นไวยากรณ์แบบอินไลน์จึงไม่ได้เร็วกว่า FILTERการแยก เลือกรูปแบบที่แสดงความหมายที่ต้องการ
ตัวอย่างเช่น หากต้องการค้นหาผู้ที่เกิดก่อนปี 1994 พร้อมกับบริษัทที่พวกเขาทํางาน โดยจํากัดผลลัพธ์ไว้เฉพาะบริษัทที่มีชื่อขึ้นต้นด้วย 'A':
MATCH (p:Person WHERE p.birthday < 19940101)-[:workAt]->(c:Company WHERE c.name STARTS WITH 'A')
RETURN p.firstName, p.lastName, c.name
กรองคุณสมบัติขอบในลักษณะเดียวกัน ตัวอย่างเช่น หากต้องการส่งคืนเฉพาะผู้ที่เริ่มทํางานในบริษัทในปี 2000 หรือหลังจากนั้น ให้ทําดังนี้
MATCH (p:Person)-[w:workAt WHERE w.workFrom >= 2000]->(c:Company)
RETURN p.firstName, p.lastName, c.name, w.workFrom
สําหรับข้อมูลเพิ่มเติมเกี่ยวกับการเลือกระหว่างการกรองแบบอินไลน์และหลังการแข่งขัน ดูที่ เพิ่มประสิทธิภาพการสืบค้น GQL
จัดการค่า Null ในตัวกรอง
GQL ใช้ตรรกะสามค่า: เพรดิเคตประเมินเป็น TRUE, FALSEหรือ UNKNOWN. เมื่อค่าคุณสมบัติเป็น null การเปรียบเทียบจะส่งกลับUNKNOWN
FILTER ถือว่า UNKNOWN ไม่ตรงกัน ดังนั้นแถวจึงถูกแยกออก
ใช้ IS NULL และ IS NOT NULL เพื่อทดสอบค่า Null อย่างชัดเจน:
-- Only include people whose browser is known
MATCH (p:Person)
FILTER p.browserUsed IS NOT NULL
RETURN p.firstName, p.browserUsed
ใช้เพื่อ coalesce() แทนที่ค่าเริ่มต้นเมื่อคุณสมบัติอาจเป็น null
MATCH (p:Person)
RETURN p.firstName, coalesce(p.browserUsed, 'Unknown browser') AS browser
ข้อควรระวัง
NULL = NULL ประเมินเป็น UNKNOWNไม่ใช่ TRUE. ใช้เพื่อ IS NULL ทดสอบค่า Null เสมอ ไม่ใช่ความเท่าเทียมกัน
รวมผลลัพธ์ด้วย RETURN
ใช้ฟังก์ชันการรวมเพื่อ RETURN สรุปผลลัพธ์ของคุณ กราฟรองรับฟังก์ชันรวมดังต่อไปนี้: , , , , MINMAX, COLLECT_LIST, , COLLECT_ONE, และ COLLECT_ELEMENTS. AVGSUMCOUNT
ตัวอย่างเช่น เมื่อต้องการนับจํานวนคนทั้งหมดในกราฟ ให้ทําดังนี้
MATCH (p:Person)
RETURN count(*) AS totalPeople
ในการนับค่านิยมที่แตกต่างกัน เช่น จํานวนบริษัทที่แตกต่างกันที่จ้างคน:
MATCH (p:Person)-[:workAt]->(c:Company)
RETURN count(DISTINCT c) AS companyCount
กรองข้อมูลสําหรับกลุ่มรวมหนึ่งชุด
เพิ่ม FILTER (WHERE predicate) หลังการรวมข้อมูลเพื่อกรองเฉพาะข้อมูลนําเข้าของตัวรวมนั้นเท่านั้น aggregate อื่น ๆ ในชุดเดียวกัน RETURN ยังคงรับแถวอินพุตทั้งหมด
MATCH (p:Person)
RETURN count(*) AS allPeople,
count(*) FILTER (WHERE p.birthday < 19900101) AS peopleBornBefore1990
เพิ่ม LIMIT ในตัวกรองรวมเพื่อใช้แถวที่มีคุณสมบัติเหมาะสมได้มากที่สุดเท่าที่ควร คําสั่งนี้จะใช้พรีดิเคตก่อนขีดจํากัดเฉพาะของกลุ่ม
MATCH (p:Person)
RETURN count(*) FILTER (WHERE p.birthday < 19900101 LIMIT 100) AS sampleCount
เฉพาะกลุ่ม FILTER ข้อมูลและ LIMIT อย่าลบแถวออกจากส่วนอื่นของคําค้นหา ใช้ FILTER คําสั่งหรือคําสั่งระดับ WHERE การจับคู่เมื่อคุณต้องการกรองสตรีมแถว
เก็บค่าต่าง ๆ
ใช้เพื่อ COLLECT_LIST คืนค่ารายการหนึ่งรายการสําหรับแต่ละค่าที่ป้อนเข้า รวมถึงค่าที่เป็นค่าเปล่า เพิ่ม DISTINCT เพื่อลบข้อมูลซ้ํา
MATCH (p:Person)
RETURN collect_list(DISTINCT p.browserUsed) AS browsers
COLLECT_ONE ส่งคืนค่าอินพุตที่ไม่เป็นศูนย์หนึ่งค่า ค่าที่เลือกไม่ใช่ค่าที่กําหนดได้ ดังนั้นใช้เฉพาะเมื่อค่าใดค่าหนึ่งจากกลุ่มนั้นยอมรับได้
COLLECT_ELEMENTS รับอินพุตที่มีค่าเป็นรายการและนําองค์ประกอบของมันมารวมเป็นรายการเดียว:
MATCH (p:Person)
RETURN collect_elements([p.firstName, p.lastName]) AS names
หากไม่จัดกลุ่มคอลัมน์ การสืบค้นแบบรวมที่ไม่มีแถวอินพุตจะคืนค่ารายการว่างจาก COLLECT_LIST และ COLLECT_ELEMENTS และ null จากCOLLECT_ONE
จัดกลุ่มผลการค้นหาด้วย GROUP BY
ใช้เพื่อGROUP BYRETURNจัดกลุ่มแถวตามค่าที่ใช้ร่วมกันและคํานวณการรวมภายในแต่ละกลุ่ม การจัดกลุ่มนี้เทียบเท่ากับ GQL ของ SQL GROUP BY.
ตัวอย่างเช่น เมื่อต้องการนับพนักงานต่อบริษัท:
MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
ORDER BY employeeCount DESC
จัดกลุ่มตามหลายคอลัมน์และคํานวณการรวมหลายรายการพร้อมกัน ตัวอย่างเช่น แบ่งจํานวนบุคคลและช่วงวันเกิดตามเพศและเบราว์เซอร์ โดยส่งคืนชุดค่าผสมที่พบบ่อยที่สุด 10 ชุด:
MATCH (p:Person)
LET gender = p.gender
LET browser = p.browserUsed
RETURN gender,
browser,
count(*) AS personCount,
min(p.birthday) AS earliestBirthday,
max(p.birthday) AS latestBirthday
GROUP BY gender, browser
ORDER BY personCount DESC
LIMIT 10
Note
นิพจน์ที่ไม่ใช่การรวมทั้งหมดในRETURNต้องปรากฏในGROUP BY นิพจน์ที่ไม่ได้อยู่ใน GROUP BY ต้องใช้ฟังก์ชันการรวม
จัดเรียงและจํากัดผลลัพธ์แบบรวม
ใช้ ORDER BY และ LIMIT ร่วมกับ GROUP BY เพื่อค้นหาผลลัพธ์ N อันดับแรก
ตัวอย่างเช่น เมื่อต้องการค้นหาเมืองห้าอันดับแรกตามจํานวนผู้อยู่อาศัย:
MATCH (p:Person)-[:isLocatedIn]->(city:City)
LET cityId = city.id, cityName = city.name
RETURN cityId, cityName, count(*) AS residentCount
GROUP BY cityId, cityName
ORDER BY residentCount DESC
LIMIT 5
สำคัญ
วางORDER BYก่อนLIMIT
LIMIT นําไปใช้กับชุดผลลัพธ์ที่เรียงลําดับแล้วเสมอ
กําหนดเส้นทางแถวด้วยคําสั่งเงื่อนไข
ใช้คําสั่งเงื่อนไขเพื่อส่งแถวขาเข้าแต่ละแถวไปยังสาขาที่ตรงกันครั้งแรก ข้อมูลนําเข้าสามารถมาจากขั้นตอนการสืบค้นก่อนหน้าใดก็ได้ ไม่ใช่แค่การรวมข้อมูล ตัวอย่างเช่น คําค้นหาต่อไปนี้จัดหมวดหมู่บริษัทหลังจากคํานวณจํานวนพนักงาน:
MATCH (p:Person)-[:workAt]->(c:Company)
LET companyId = c.id, companyName = c.name
RETURN companyId, companyName, count(*) AS employeeCount
GROUP BY companyId, companyName
NEXT
WHEN employeeCount >= 100u THEN
RETURN companyId, companyName, employeeCount, 'Large' AS category
WHEN employeeCount >= 10u THEN
RETURN companyId, companyName, employeeCount, 'Medium' AS category
ELSE
RETURN companyId, companyName, employeeCount, 'Small' AS category
สาขาสามารถรันคําสั่ง query ที่สมบูรณ์และ nested procedure ได้ แทนที่จะคืนค่าเฉพาะ expression ตัวอย่างต่อไปนี้ส่งสามแถวอินพุตผ่านรูปร่างสาขาที่แตกต่างกัน สาขาหนึ่งรัน MATCH, branch หนึ่งรวมสอง aggregate กับ UNION ALL แล้วรวมผลลัพธ์ของมัน และ branch สํารองจะคืนค่าคงที่:
FOR selector IN [1, 2, 3]
RETURN selector
NEXT
WHEN selector = 1 THEN
MATCH (:Person)-[:knows]->(:Person)
RETURN count(*) AS total, 'Knows edges' AS category
WHEN selector = 2 THEN {
MATCH (:Person)-[:workAt]->(:Company)
RETURN count(*) AS partialCount
UNION ALL
MATCH (:Person)-[:studyAt]->(:University)
RETURN count(*) AS partialCount
NEXT
RETURN sum(partialCount) AS total, 'Affiliation edges' AS category
}
ELSE
RETURN 0u AS total, 'No selected metric' AS category
เครื่องมือค้นหาจะประเมินพรีดิเคตตามลําดับสําหรับแต่ละแถว มันวิ่งเฉพาะสาขาที่ตรงกันแรกเท่านั้น ถ้าพรีดิเคตประเมินค่าไปยัง UNKNOWN, การประเมินจะดําเนินต่อไปยังสาขาถัดไป หากไม่มี ELSE, แถวที่ไม่ตรงกับ WHEN กิ่งจะถูกละเว้น
ประโยค CASE เงื่อนไขแตกต่างจากนิพจน์ กราฟรองรับนิพจน์ง่าย ๆ CASE <expression> WHEN <value> สําหรับการเลือกค่าตามความเท่าเทียมกัน คําค้นหา CASE WHEN <predicate> ไม่รองรับ สําหรับข้อมูลเพิ่มเติม ดูที่ คําสั่งเงื่อนไข