กรองและรวมข้อมูลกราฟใน Microsoft Fabric

การกรองจะจํากัดผลลัพธ์ให้แคบลงเป็นแถวที่สําคัญ การรวมจะสรุปแถวเหล่านั้นเป็นจํานวน ผลรวม และค่าเฉลี่ย บทความนี้แสดงวิธีการใช้เทคนิคทั้งสองในคิวรี GQL กับกราฟใน Microsoft Fabric

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

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