นิพจน์ GQL เพรดิเคต และฟังก์ชัน

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

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

สัญพจน์

สัญพจน์เป็นนิพจน์แบบง่ายที่ประเมินโดยตรงไปยังค่าที่ระบุ บทความ ค่า GQL และชนิดค่า อธิบายสัญพจน์ของค่าแต่ละชนิดโดยละเอียด

ตัวอย่าง:

1
1.0d
1.00m
TRUE
"Hello, graph!"
[ 1, 2, 3 ]
NULL

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

เพรดิเคต

เพรดิเคตคือนิพจน์บูลีนที่คุณมักใช้เพื่อกรองผลลัพธ์ในคิวรี GQL ซึ่งจะประเมินเป็น TRUE, FALSEหรือ UNKNOWN (null)

ข้อควรระวัง

เมื่อคุณใช้เพรดิเคตเป็นตัวกรอง เพรดิเคตจะเก็บเฉพาะรายการที่เพรดิเคตประเมินเป็น TRUEเท่านั้น

เพรดิเคตการเปรียบเทียบ

ใช้ตัวดําเนินการเหล่านี้เพื่อเปรียบเทียบค่า:

  • = (เท่ากับ)
  • <> (ไม่เท่ากับ)
  • < (น้อยกว่า)
  • > (มากกว่า)
  • <= (น้อยกว่าหรือเท่ากับ)
  • >= (มากกว่าหรือเท่ากับ)

GQL ใช้ตรรกะแบบสามค่าที่การเปรียบเทียบกับค่าส่งกลับ UNKNOWNnull :

นิพจน์ ผลลัพธ์
5 = 5 TRUE
5 = 3 FALSE
5 = NULL UNKNOWN
NULL = NULL UNKNOWN

สําหรับพฤติกรรมการเปรียบเทียบเฉพาะ โปรดดูเอกสารสําหรับค่าแต่ละชนิดในค่า GQL และชนิดของค่า

ตัวอย่าง:

MATCH (p:Person)
FILTER WHERE p.birthday <= 20050915
RETURN p.firstName

ถ้าโอเปอแรนด์ทั้งสองเป็นตัวเลข GQL จะเปรียบเทียบด้วยค่าตัวเลขของมัน

Important

กราฟยังไม่รองรับการเปรียบเทียบเชิงตัวเลขทุกแบบที่ GQL กําหนดไว้ พฤติกรรมปัจจุบันใช้กฎเหล่านี้:

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

นิพจน์เชิงตรรกะ

รวมเงื่อนไขด้วยตัวดําเนินการตรรกะ:

  • AND (เงื่อนไขทั้งสองเป็นจริง)
  • OR (เงื่อนไขอย่างใดอย่างหนึ่งเป็นจริง)
  • NOT (เงื่อนไขค่าลบล้าง)
  • XOR (การแยกเฉพาะ — จริง เมื่อตัวถูกดําเนินการตัวหนึ่งเป็นจริง)

ตัวอย่าง:

MATCH (p:Person)
FILTER WHERE p.birthday <= 20050915 AND p.firstName = 'John'
RETURN p.firstName || ' ' || p.lastName AS fullName

เพรดิเคตการมีอยู่ของคุณสมบัติ

เมื่อต้องการตรวจสอบว่ามีคุณสมบัติหรือไม่ ให้ใช้เพรดิเคตเหล่านี้:

p.locationIP IS NOT NULL
p.browserUsed IS NULL

Note

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

ซับคิวรีการมีอยู่

ใช้คําสั่งย่อย procedure-form EXISTS เพื่อทดสอบว่าคําสั่งที่ฝังอยู่ในระบบส่งคืนอย่างน้อยหนึ่งแถวหรือไม่:

EXISTS {
  <query statements>
  RETURN <columns>
}

ผลลัพธ์คือค่าบูลีนที่ไม่เป็นศูนย์:

  • TRUE หากซับคิวรีคืนค่าหนึ่งแถวหรือมากกว่า
  • FALSE หากซับคิวรีไม่คืนค่าแถวใด ๆ

ตัวแปรที่อยู่ในขอบเขตอยู่แล้วจะมีอยู่โดยนัยภายในซับคิวรี ตัวแปรที่เพิ่มเข้ามาเฉพาะในซับคิวรีจะไม่พร้อมใช้งานภายนอกซับคิวรี

การใช้งาน EXISTS ในตัวกรอง:

MATCH (p:Person)
WHERE EXISTS {
  MATCH (p)-[:knows]->(friend:Person)
  RETURN friend
}
RETURN p.firstName, p.lastName

ใช้เพื่อ NOT EXISTS เก็บแถวที่ซับคิวรีไม่คืนค่าแถว คุณยังสามารถใช้ EXISTS ตัวกรอง LET, RETURN, ORDER BY, และรวม หรือนิพจน์ต้นทางได้ EXISTS ไม่รองรับภายในตัวกรองพรีดิเคตรายการ

Important

รูปแบบเฉพาะรูปแบบกราฟ เช่น EXISTS { (p)-[:knows]->(friend) } และ EXISTS ((p)-[:knows]->(friend)) ไม่รองรับ ใช้แบบฟอร์มขั้นตอนที่แสดงในตัวอย่างข้างต้น ซับคิวรีแบบสเกลาร์ VALUE { ... } ไม่รองรับ

ข้อควรระวัง

EXISTS ทดสอบว่าซับคิวรีคืนค่าแถวหรือไม่ ไม่ใช่ว่าค่ารวมไม่เป็นศูนย์หรือไม่ การรวมที่ไม่ได้จัดกลุ่ม เช่น RETURN count(*) คืนค่าหนึ่งแถวแม้ว่าMATCHจะไม่พบแถวใด ๆ ดังนั้นรูปแบบของ จะEXISTSประเมินค่าเป็นTRUE คืนค่าตัวแปรที่ตรงกันเมื่อคุณต้องการทดสอบว่ามีตัวแปรตรงกันหรือไม่

สําหรับข้อมูลเพิ่มเติมเกี่ยวกับคําค้นหาย่อยที่เกี่ยวข้อง โปรดดู CALL ข้อความ ในคู่มือภาษา GQL

เพรดิเคตสมาชิกรายการ

ทดสอบถ้าค่าอยู่ในรายการ:

p.firstName IN ['Alice', 'Bob', 'Charlie']
p.gender NOT IN ['male', 'female']

ฟังก์ชันพรีดิเคตรายการ

ใช้ฟังก์ชัน list predicate เพื่อประเมินนิพจน์บูลีนสําหรับสมาชิกในรายการ:

ALL(element IN list WHERE predicate)
ANY(element IN list WHERE predicate)
NONE(element IN list WHERE predicate)
SINGLE(element IN list WHERE predicate)

ซอร์สโค้ดอาจเป็นลิทเทอรัลรายการ คุณสมบัติที่มีค่าเป็นรายการ ตัวแปร หรือรายการกลุ่มจากรูปแบบความยาวแปรผัน

ฟังก์ชันเหล่านี้มีความหมายดังนี้:

Function ความหมาย
ALL ทุกองค์ประกอบจะเป็นไปตามเงื่อนไข
ANY อย่างน้อยหนึ่งองค์ประกอบที่เป็นไปตามพรีดิเคต
NONE ไม่มีองค์ประกอบใดที่เป็นไปตามพรีดิเคต
SINGLE มีเพียงองค์ประกอบเดียวที่ตรงตามพรีดิเคต

ตัวอย่างต่อไปนี้ประเมินฟังก์ชันทั้งสี่บนรายการที่สร้างขึ้นแบบไดนามิก:

LET items = [1, 2, 3]
RETURN ALL(x IN items WHERE x > 0) AS all_match,
       ANY(x IN items WHERE x = 2) AS any_match,
       NONE(x IN items WHERE x < 0) AS none_match,
       SINGLE(x IN items WHERE x = 2) AS single_match

ค่าที่คืนทั้งสี่ค่าคือ TRUE.

คุณยังสามารถประเมินคุณสมบัติขององค์ประกอบจากรายการได้ด้วย ในตัวอย่าง connections นี้ คือรายการกลุ่มที่สร้างโดยรูปแบบขอบที่มีความยาวแปรผัน:

MATCH (person:Person)-[connections:knows]->{1,4}(friend:Person)
WHERE ALL(connection IN connections WHERE connection.creationDate IS NOT NULL)
RETURN person.firstName, friend.firstName

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

Function TRUE FALSE UNKNOWN รายการว่างเปล่า
ALL ผลลัพธ์ของฟิลเตอร์ทุกตัวคือ TRUE. อย่างน้อยหนึ่งผลลัพธ์คือFALSE ไม่มีผลลัพธ์ใดที่เป็น FALSE, และอย่างน้อยหนึ่งผลลัพธ์คือ UNKNOWN. TRUE
ANY ผลลัพธ์ของตัวกรองอย่างน้อยหนึ่งรายการคือ TRUE. ไม่มีผลลัพธ์ใด ๆ คือ TRUE หรือ UNKNOWN. ไม่มีผลลัพธ์ใดที่เป็น TRUE, และอย่างน้อยหนึ่งผลลัพธ์คือ UNKNOWN. FALSE
NONE ไม่มีผลลัพธ์ใด ๆ คือ TRUE หรือ UNKNOWN. อย่างน้อยหนึ่งผลลัพธ์คือTRUE ไม่มีผลลัพธ์ใดที่เป็น TRUE, และอย่างน้อยหนึ่งผลลัพธ์คือ UNKNOWN. TRUE
SINGLE ผลลัพธ์หนึ่งอย่างคือ , และไม่มีผลลัพธ์ TRUEใดเป็น UNKNOWN. ผลลัพธ์มากกว่าหนึ่งรายการเป็น TRUE, หรือไม่มีผลลัพธ์ใด ๆ เป็น TRUE หรือ UNKNOWN. ผลลัพธ์สูงสุดหนึ่งผลลัพธ์คือ TRUE, และอย่างน้อยหนึ่งผลลัพธ์คือ UNKNOWN. FALSE

ถ้ารายการต้นทางเป็น null ฟังก์ชันแต่ละตัวจะคืนค่าUNKNOWN องค์ประกอบ null list จะให้ผลลัพธ์ในการประเมินตัวกรองโดยผูกองค์ประกอบนั้นเป็น null;มันจะไม่ทําให้ผลลัพธ์ของฟังก์ชันไม่ทราบโดยอัตโนมัติ

ตัวแปรองค์ประกอบนี้จะมีให้เฉพาะในนิพจน์ตัวกรองของเงื่อนไขรายการเท่านั้น ตัวกรองยังสามารถอ้างอิงตัวแปรจากคําค้นหาที่ล้อมรอบได้ด้วย ถ้าตัวแปรองค์ประกอบมีชื่อเดียวกับตัวแปรภายนอก ตัวแปรองค์ประกอบท้องถิ่นจะมีลําดับความสําคัญ พรีดิเคตแบบ nested list ก็สามารถเงาตัวแปรองค์ประกอบภายนอกได้เช่นกัน

ฟังก์ชันรวมสามารถอ้างอิงรายการกลุ่มที่ล้อมรอบได้ แต่ไม่สามารถรวมตัวแปรที่ผูกกับท้องถิ่นได้ EXISTS ซับคิวรีก็ไม่รองรับภายในตัวกรองพรีดิเคตรายการเช่นกัน

ANY(...) เป็นฟังก์ชันพรีดิเคตแบบลิสต์ อย่าสับสนกับ ANY SHORTEST คํานําหน้าการค้นหาเส้นทางหรือ ANY ประเภทค่าแบบไดนามิก

เพรดิเคตรูปแบบสตริง

จับคู่สตริงโดยใช้เทคนิคการจับคู่รูปแบบ:

p.firstName CONTAINS 'John'
p.browserUsed STARTS WITH 'Chrome'
p.locationIP ENDS WITH '.1'

สําหรับการจับคู่นิพจน์ปกติของ RE2 ให้ใช้ MSFT.REGEXP_LIKE.

นิพจน์ทางคณิตศาสตร์

ใช้ตัวดําเนินการทางคณิตศาสตร์มาตรฐานที่มีค่าตัวเลข:

  • + (เพิ่มเติม)
  • - (การลบ)
  • * (การคูณ)
  • / (หาร)

ตัวดําเนินการทางคณิตศาสตร์เป็นไปตามหลักทั่วไปทางคณิตศาสตร์

ก่อนหน้า:

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

ตัวอย่าง:

(p.birthday < 20050915 OR p.birthday > 19651231) AND p.gender = 'male'

กฎการเข้ารหัส:

ใช้กฎต่อไปนี้ตามลําดับลําดับความสําคัญ:

  1. นิพจน์เลขคณิตที่เกี่ยวข้องกับชนิดตัวเลขโดยประมาณ จะคืนค่าประเภทตัวเลขโดยประมาณ
  2. นิพจน์เลขคณิตที่เกี่ยวข้องกับทั้งชนิดจํานวนเต็มที่มีเครื่องหมายและไม่มีเครื่องหมายจะคืนค่าชนิดจํานวนเต็มที่มีเครื่องหมาย

การเข้าถึงคุณสมบัติ

เข้าถึงคุณสมบัติโดยใช้สวรรคจุด:

p.firstName
edge.creationDate

การเข้าถึงรายการ

เข้าถึงองค์ประกอบรายการโดยใช้การจัดทําดัชนีแบบฐานศูนย์:

interests[0]    -- first element
interests[1]    -- second element

ฟังก์ชันที่มีอยู่ภายใน

GQL สนับสนุนฟังก์ชันในตัวต่าง ๆ สําหรับการประมวลผลข้อมูลและการวิเคราะห์

ฟังก์ชันเชิงตัวเลข

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

คุณค่าและพลังสัมบูรณ์

Function Description
ABS(value) ส่งคืนค่าสัมบูรณ์ ผลลัพธ์จะมีชนิดตัวเลขเหมือนกับ value.
POWER(base, exponent) เพิ่ม base เป็น exponent และคืนค่า DOUBLE.

ทั้งสองฟังก์ชันรับค่าตัวเลข อาร์กิวเมนต์ null จะให้ค่า null การดําเนินการเชิงตัวเลขที่ไม่ถูกต้อง เช่น ผลลัพธ์ล้น POWER จะทําให้เกิดข้อผิดพลาด

RETURN ABS(-1) AS absoluteValue, POWER(2, -2) AS reciprocalSquare

ผลลัพธ์คือ:

ค่าสัมบูรณ์ สแควร์แบบกลับกัน
1 0.25

ฟังก์ชันตรีโกณมิติ

ฟังก์ชันตรีโกณมิติรับค่าตัวเลขหนึ่งค่าและคืนค่าDOUBLE อาร์กิวเมนต์ null จะให้ค่า null

Function Description
SIN(value), , COS(value), TAN(value)COT(value) คํานวณฟังก์ชันตรีโกณมิติ value เป็นมุมในหน่วยเรเดียน
ASIN(value), ACOS(value), ATAN(value) คํานวณฟังก์ชันตรีโกณมิติผกผัน ผลลัพธ์คือเรเดียน ASIN และ ACOS ต้องการค่าตั้งแต่ -1 ผ่าน 1.
SINH(value), COSH(value), TANH(value) คํานวณฟังก์ชันไฮเปอร์โบลิก
DEGREES(value) แปลงมุมจากเรเดียนเป็นองศา
RADIANS(value) แปลงมุมจากองศาเป็นเรเดียน

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

RETURN COS(0) AS cosine, RADIANS(180) AS angle

ผลลัพธ์คือ:

โคไซน์ มุม
1.0 3.141592653589793238462643383279502884

ช่วงจํานวนเต็ม

RANGE(start, end) คืนค่ารายการจํานวนเต็มจาก start ทางไปทาง endโดยใช้ขั้นตอนของ 1. RANGE(start, end, step) ใช้ขั้นตอนที่ไม่เป็นศูนย์ที่ระบุ start, end, และ step ต้องเป็นจํานวนเต็มที่ไม่ว่าง ศูนย์ใช้ได้สําหรับ start หรือ end; เฉพาะ step ต้องไม่เป็นศูนย์เท่านั้น

ช่วงนี้ประกอบด้วย start. มันรวม end เฉพาะเมื่อเพิ่ม step ระยะเรื้อรั end งซ้ําๆ อย่างแม่นยําเท่านั้น สเต็ปบวกที่มีstartมากกว่า end, หรือสเต็ปลบที่มีstartendน้อยกว่า จะคืนรายการว่าง ขั้นตอนศูนย์จะทําให้เกิดข้อผิดพลาด

RETURN RANGE(0, 10, 3) AS ascending, RANGE(5, 0, -2) AS descending

ผลลัพธ์คือ:

กําลังขึ้น กําลังลง
[0, 3, 6, 9] [5, 3, 1]

ถ้าอาร์กิวเมนต์ทั้งหมดเป็นจํานวนเต็มRANGEที่ไม่มีเครื่องหมาย จะคืนค่าLIST<UINT64> มิฉะนั้น จะคืนค่า a LIST<INT64> และปฏิเสธค่าที่ไม่สามารถแทนเป็นจํานวนเต็มที่มีเครื่องหมายได้อย่างปลอดภัย

ฟังก์ชันการรวม

ฟังก์ชันรวมรวมค่าต่าง ๆ ทั้งในแถวอินพุตหรือภายในรายการกลุ่มที่ถูกจํากัดด้วยรูปแบบความยาวแปรผัน

Function Description
COUNT(*) นับแถวอินพุต รวมถึงแถวที่มีค่าว่าง
COUNT(expression) นับผลลัพธ์ที่ไม่เป็นศูนย์ของexpression
SUM(expression) ส่งคืนผลรวมของค่าตัวเลขที่ไม่เป็นค่าว่าง
AVG(expression) คืนค่าเฉลี่ยของค่าตัวเลขที่ไม่เป็นศูนย์
MIN(expression) ส่งคืนค่าขั้นต่ําที่ไม่เป็นศูนย์
MAX(expression) คืนค่าค่าสูงสุดที่ไม่เป็นค่าว่าง
COLLECT_LIST(expression) ส่งคืนรายการที่มีหนึ่งองค์ประกอบสําหรับแต่ละอินพุต รวมถึงองค์ประกอบที่เป็นศูนย์
COLLECT_ONE(expression) คืนค่าอินพุตที่ไม่เป็นศูนย์หนึ่งค่า ค่าที่เลือกไม่ใช่ค่าที่กําหนดแน่นอน
COLLECT_ELEMENTS(expression) นําองค์ประกอบของอินพุตที่มีค่าเป็นรายการมารวมกันเป็นรายการเดียว รายการอินพุตที่ไม่มีค่าจะเพิ่มองค์ประกอบใด ๆ แต่จะยังคงมีองค์ประกอบว่างในรายการในผลลัพธ์

เมื่อคําสั่ง aggregate ไม่มีคอลัมน์จัดกลุ่มและไม่ได้รับแถว COUNT อินพุต จะคืนค่า 0และ COLLECT_LISTCOLLECT_ELEMENTS คืนค่ารายการว่าง และฟังก์ชัน aggregate อื่น ๆ คืนค่า null อย่าเชื่อในลําดับของค่าที่คืนโดยคอลเลกชันรวม เมื่อจัดกลุ่มคอลัมน์ ไม่มีแถวอินพุตใดจะสร้างกลุ่มและจึงไม่มีแถวผลลัพธ์

ตั้งค่าตัวบ่งชี้

ใช้เพื่อ ALL รวมค่าที่ซ้ํากันหรือ DISTINCT เพื่อลบค่าเหล่านั้น ALL เป็นค่าเริ่มต้นสําหรับการรวมนิพจน์ COUNT(*) ไม่ยอมรับตัวบ่งชี้ที่กําหนดไว้

MATCH (person:Person)
RETURN COUNT(person) AS personCount,
       COUNT(DISTINCT person.browserUsed) AS browserCount

สําหรับ COLLECT_LIST, DISTINCT ลบค่าที่ซ้ํากันและเก็บค่า null ไว้สูงสุดหนึ่งค่า สําหรับ COLLECT_ELEMENTS, DISTINCT ใช้กับองค์ประกอบหลังจากที่รายการอินพุตถูกต่อกันแล้ว DISTINCT ไม่ได้ทําให้ COLLECT_ONE มันเป็นเรื่องกําหนดแน่นอน

ตัวกรองและขีดจํากัดเฉพาะกลุ่ม

บวก FILTER (WHERE predicate) หลังการรวมเพื่อรวมเฉพาะค่าที่เป็น predicate จริงเท่านั้น ผลลัพธ์พรีดิเคตที่ผิดพลาดและไม่ทราบจะถูกตัดออก ตัวกรองนี้จะมีผลเฉพาะกับการรวมนั้นเท่านั้น ไม่ส่งผลต่อแถวอินพุตที่มีให้กับนิพจน์อื่นในนิพจน์เดียวกันRETURN

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

MATCH (person:Person)
RETURN COUNT(*) AS allPeople,
       COUNT(*) FILTER (WHERE person.birthday < 19900101 LIMIT 5) AS sampleBornBefore1990

การรวมข้อมูลข้ามแถว

โดยปกติ aggregate จะรวมค่าในแนวตั้งข้ามแถวอินพุต ใช้เพื่อ GROUP BY คํานวณผลลัพธ์หนึ่งรายการสําหรับแต่ละกลุ่ม

MATCH (p:Person)
RETURN count(*) AS total_people, avg(p.birthday) AS average_birth_year
MATCH (p:Person)-[:isLocatedIn]->(c:City)
RETURN c.id AS cityId, c.name, count(*) AS population, avg(p.birthday) AS average_birth_year
GROUP BY cityId, c.name

อย่าวางกลุ่มรวมแนวตั้งหนึ่งโดยตรงภายในอีกอันหนึ่งในบล็อกคําสั่งเดียวกัน ตัวอย่างเช่น SUM(COUNT(*)) เป็น invalid ใช้เพื่อ NEXT แยกขั้นตอนการรวมข้อมูลเมื่อคุณต้องการรวมผลลัพธ์แบบรวม

การรวมภายในเส้นทางที่ตรงกัน

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

MATCH (person:Person)-[knows:knows]->{1,5}(friend:Person)
RETURN COUNT(knows) AS pathLength

ที่นี่ คืน COUNT(knows) ค่าจํานวนขอบในแต่ละเส้นทางที่จับคู่ รูปแบบแนวนอนของ COUNT, SUM, AVG, MIN, COLLECT_ONEMAXCOLLECT_LISTและ COLLECT_ELEMENTS ได้รับการรองรับ COUNT(*) และเฉพาะกลุ่ม FILTER หรือ LIMIT ไม่ใช่รูปแบบแนวนอน

การรวมแนวนอนสามารถเป็นอินพุตของการรวมแนวตั้งด้านนอกหนึ่งชุด:

MATCH (person:Person)-[knows:knows]->{1,5}(friend:Person)
RETURN MIN(COUNT(knows)) AS shortestMatchedPath

ในคําค้นหา COUNT(knows) นี้ จะคํานวณความยาวหนึ่งความยาวต่อเส้นทางที่ตรงกัน และ MIN รวมความยาวเหล่านั้นข้ามแถวอินพุต

สําหรับตัวอย่างที่เน้นงาน ดูที่ กรองและรวบรวมข้อมูลกราฟ

นิพจน์เงื่อนไข

ใช้นิพจน์ง่าย ๆ CASE เพื่อเปรียบเทียบนิพจน์หนึ่งกับค่าหนึ่งค่าหรือมากกว่านั้น และคืนผลลัพธ์ที่เกี่ยวข้องกับค่าที่เท่ากันครั้งแรก:

CASE expression
  WHEN value1 THEN result1
  WHEN value2 THEN result2
  ELSE default_result
END

NULLIF:

NULLIF(a, b)แสดง NULL หาก a เท่ากับ bหรือระบบจะแสดงเป็นa

ตัวอย่าง:

MATCH (p:Person)
RETURN p.firstName,
       CASE p.gender
         WHEN 'male' THEN 'M'
         WHEN 'female' THEN 'F'
         ELSE 'Other'
       END AS gender_code,
       NULLIF(p.browserUsed, 'Unknown') AS browser

คําค้นหา CASE WHEN <predicate> ไม่รองรับ หากต้องการกําหนดเส้นทางแถวโดยใช้พรีดิเคตและรันคําสั่งสืบค้นหรือขั้นตอนซ้อนสําหรับสาขาที่เลือก ให้ใช้WHENคําสั่งแบบมีเงื่อนไข

ฟังก์ชันสตริง

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

ความยาวตัวอักษรและตัวพิมพ์

ใช้ฟังก์ชันเหล่านี้เพื่อวัดหรือเปลี่ยนสตริงตัวอักษร:

Function Description
CHAR_LENGTH(string) แสดงจํานวนอักขระ
UPPER(string) ใช้การแมปตัวพิมพ์ใหญ่ของ Unicode
LOWER(string) ใช้การแมปตัวพิมพ์เล็กแบบ Unicode
CASEFOLD(string) ใช้การพับตัวอักษร Unicode ที่ไม่ขึ้นกับภาษาท้องถิ่นสําหรับการจับคู่แบบไม่มีตัวพิมพ์ใหญ่

การแมป Unicode สามารถเปลี่ยนความยาวหรือการแทนค่าของสตริงได้:

RETURN UPPER('straße') AS uppercase,
       LOWER('İ') AS lowercase,
       CASEFOLD('Straße') AS folded

ผลลัพธ์คือ STRASSE, i̇, และ strasse, ตามลําดับ CASEFOLD ไม่เทียบเท่ากับ LOWER. ตัวอย่างเช่น การพับกรณีไปยังßssและแมปซิΣกมาของกรีก , σ, และ ς ไปยัง σ.

ทําให้สตริงเป็นมาตรฐาน

GQL กําหนดรูปแบบการทําให้เป็นมาตรฐานของ Unicode สี่รูปแบบ:

  • รูปแบบการทําให้เป็นมาตรฐาน C (NFC), องค์ประกอบแบบมาตรฐาน
  • รูปแบบการทําให้เป็นมาตรฐาน Form D (NFD), การแยกย่อยแบบแคนอนิคัล
  • แบบฟอร์มการทําให้เป็นมาตรฐาน KC (NFKC), องค์ประกอบความเข้ากันได้
  • แบบฟอร์มการทําให้เป็นมาตรฐาน KD (NFKD), การแยกความเข้ากันได้

NORMALIZE(string) ตั้งค่าเริ่มต้นเป็น NFC ระบุฟอร์มการทําให้เป็นมาตรฐานเป็นอาร์กิวเมนต์ที่สอง:

RETURN NORMALIZE('cafe\u0301') AS composed,
       NORMALIZE('café', NFD) AS decomposed

อาร์กิวเมนต์ต้องเป็นสตริง

Important

ปัจจุบัน Graph รองรับ NFC และ NFD การระบุ NFKC หรือ NFKD จะทําให้เกิดข้อผิดพลาด

ตัดสาย

ใช้เพื่อ TRIM ลบช่องว่างหรืออักขระที่ระบุหนึ่งตัวจากทั้งสองปลาย จุดเริ่มต้น หรือจุดสิ้นสุดของสตริง:

RETURN TRIM('  text  ') AS both_ends,
       TRIM(BOTH FROM '  text  ') AS explicit_both,
       TRIM(LEADING FROM '  text  ') AS beginning,
       TRIM(TRAILING FROM '  text  ') AS ending,
       TRIM(LEADING 'f' FROM 'foobar') AS custom_character

ค่า trim ที่กําหนดเองต้องมีความยาวเท่ากับหนึ่งไบต์พอดี อักขระ Unicode หลายไบต์และสตริงที่มีหลายตัวอักษรไม่รองรับเป็นค่าตัดแบบกําหนดเอง แหล่งที่มาที่เป็น null หรือค่า trim ที่กําหนดเองจะคืนค่า null

เชื่อมต่อสตริง

STRING_JOIN(list [, delimiter]) รวมรายการสตริง ตัวคั่นเริ่มต้นคือเครื่องหมายจุลภาคตามด้วยช่องว่าง:

RETURN STRING_JOIN(['foo', 'bar', 'baz']) AS default_delimiter,
       STRING_JOIN(['foo', 'bar', 'baz'], '-') AS custom_delimiter

ผลลัพธ์คือ foo, bar, baz และfoo-bar-baz รายการว่างจะคืนค่าสตริงว่าง รายการ null, ตัวคั่น null หรือองค์ประกอบรายการ null จะคืนค่า null ทุกองค์ประกอบในรายการที่ไม่ใช่ null ต้องเป็นสตริง

ฟังก์ชันนิพจน์ปกติ

กราฟให้ฟังก์ชันนิพจน์ปกติเหล่านี้เป็นส่วนขยายของ GQL:

Function ใช้
MSFT.REGEXP_LIKE ตรวจสอบว่าข้อความมีข้อความตรงกันหรือไม่
MSFT.REGEXP_COUNT นับจํานวนแมตช์
MSFT.REGEXP_INSTR ค้นหาตําแหน่งของแมตช์หรือกลุ่มจับภาพ
MSFT.REGEXP_SUBSTR คืนข้อความของกลุ่มจับคู่หรือจับภาพ
MSFT.REGEXP_REPLACE แทนที่ข้อความที่ตรงกัน
MSFT.REGEXP_LIKE

คืนค่า TRUE เมื่อรูปแบบตรงกับส่วนใดส่วนหนึ่งของสตริงต้นทาง หากไม่พบการจับคู่ จะคืนค่าFALSE

อาร์กิวเมนต์ ไวยากรณ์
2 MSFT.REGEXP_LIKE(source, pattern)
3 MSFT.REGEXP_LIKE(source, pattern, flags)

source คือสตริงที่ต้องการค้นหา pattern ถูกจับคู่กับสตริงย่อยใด ๆ ของ source เว้นแต่นิพจน์นั้นจะใช้จุดยึด เช่น ^ หรือ $. flagsเปลี่ยนพฤติกรรมการจับคู่ตามที่อธิบายไว้ใน กฎและตัวเลือกการจับคู่

RETURN MSFT.REGEXP_LIKE('HELLO', 'hello', 'i') AS matches

ผลลัพธ์คือTRUE

MSFT.REGEXP_COUNT

คืนค่าจํานวนการจับคู่ หากไม่พบการจับคู่ จะคืนค่า0

อาร์กิวเมนต์ ไวยากรณ์
2 MSFT.REGEXP_COUNT(source, pattern)
3 MSFT.REGEXP_COUNT(source, pattern, start)
4 MSFT.REGEXP_COUNT(source, pattern, start, flags)

source คือสตริงที่ต้องการค้นหา และ pattern ระบุการจับคู่ที่จะนับ start คือตําแหน่งจุดรหัส Unicode ที่เริ่มต้นการจับคู่ได้โดยใช้ศูนย์ การแข่งขันต้องเริ่มที่ตําแหน่งนี้หรือหลังจากนั้น ตําแหน่งนี้ไม่ได้กลายเป็นจุดเริ่มต้นใหม่ของสายสําหรับลวดลายที่ยึดติด flagsเปลี่ยนพฤติกรรมการจับคู่ตามที่อธิบายไว้ใน กฎและตัวเลือกการจับคู่

RETURN MSFT.REGEXP_COUNT('1a2a3a4', '[0-9]', 3) AS match_count

การค้นหาเริ่มต้นที่ตําแหน่ง 3, วินาที a, ดังนั้นนับเฉพาะตัวเลข3และ4 ผลลัพธ์คือ2

MSFT.REGEXP_INSTR

คืนค่าตําแหน่งที่อิงศูนย์ของแมตช์หรือกลุ่มจับที่เลือก

อาร์กิวเมนต์ ไวยากรณ์
2 MSFT.REGEXP_INSTR(source, pattern)
3 MSFT.REGEXP_INSTR(source, pattern, start)
4 MSFT.REGEXP_INSTR(source, pattern, start, occurrence)
5 MSFT.REGEXP_INSTR(source, pattern, start, occurrence, return_option)
6 MSFT.REGEXP_INSTR(source, pattern, start, occurrence, return_option, flags)
7 MSFT.REGEXP_INSTR(source, pattern, start, occurrence, return_option, flags, group)

source คือสตริงที่ต้องการค้นหา และ pattern ระบุการจับคู่ start คือตําแหน่งจุดรหัส Unicode ที่เริ่มต้นการจับคู่ได้โดยใช้ศูนย์ แมตช์ต้องเริ่มต้นที่ตําแหน่งนี้หรือหลังจากตําแหน่งนี้ ซึ่งจะไม่กลายเป็นจุดเริ่มต้นใหม่ของสตริงสําหรับลวดลายที่ยึดติด

occurrence เลือกแมตช์แรก ที่สอง หรือแมตช์ถัดไปที่ไม่ทับซ้อนกันซึ่งพบจาก start. group เลือกสิ่งที่จะพบภายในแมตช์นั้น: 0 เลือกการจับคู่ทั้งหมด และค่าบวกจะเลือกกลุ่มจับที่มีหมายเลขนั้น return_option กําหนดขอบเขตของแมตช์หรือกลุ่มที่เลือกจะถูกคืน: 0 คืนตําแหน่งเริ่มต้น และ 1 คืนตําแหน่งทันทีหลังจากสิ้นสุด flagsเปลี่ยนพฤติกรรมการจับคู่ตามที่อธิบายไว้ใน กฎและตัวเลือกการจับคู่

หากไม่พบการเกิดขึ้นที่ตรงกัน หรือกลุ่มจับภาพที่เลือกไม่เข้าร่วมในเหตุการณ์นั้น ฟังก์ชันจะคืนค่า-1

RETURN MSFT.REGEXP_INSTR('banana', 'a', 0, 2) AS match_position

แมตช์ที่สองเริ่มต้นที่ตําแหน่ง 3ดังนั้นผลลัพธ์คือ 3.

MSFT.REGEXP_SUBSTR

คืนข้อความของแมตช์หรือกลุ่มจับภาพที่เลือก

อาร์กิวเมนต์ ไวยากรณ์
2 MSFT.REGEXP_SUBSTR(source, pattern)
3 MSFT.REGEXP_SUBSTR(source, pattern, start)
4 MSFT.REGEXP_SUBSTR(source, pattern, start, occurrence)
5 MSFT.REGEXP_SUBSTR(source, pattern, start, occurrence, flags)
6 MSFT.REGEXP_SUBSTR(source, pattern, start, occurrence, flags, group)

source คือสตริงที่ต้องการค้นหา และ pattern ระบุการจับคู่ start คือตําแหน่งจุดรหัส Unicode ที่เริ่มต้นการจับคู่ได้โดยใช้ศูนย์ แมตช์ต้องเริ่มต้นที่ตําแหน่งนี้หรือหลังจากตําแหน่งนี้ ซึ่งจะไม่กลายเป็นจุดเริ่มต้นใหม่ของสตริงสําหรับลวดลายที่ยึดติด

occurrence เลือกแมตช์แรก ที่สอง หรือแมตช์ถัดไปที่ไม่ทับซ้อนกันซึ่งพบจาก start. group เลือกข้อความที่จะคืนจากแมตช์นั้น: 0 เลือกการจับคู่ทั้งหมด และค่าบวกจะเลือกกลุ่มจับภาพที่มีหมายเลขนั้น flagsเปลี่ยนพฤติกรรมการจับคู่ตามที่อธิบายไว้ใน กฎและตัวเลือกการจับคู่

หากไม่พบการเกิดขึ้นที่ตรงกัน หรือกลุ่มจับภาพที่เลือกไม่เข้าร่วมในเหตุการณ์นั้น ฟังก์ชันจะคืนค่า null

RETURN MSFT.REGEXP_SUBSTR(
  '12-345',
  '([0-9]+)-([0-9]+)',
  0,
  1,
  '',
  2
) AS matched_text

การเกิดขึ้นครั้งแรกคือสตริงสมบูรณ์ และกลุ่ม2345จับคือ , ดังนั้นผลลัพธ์คือ 345.

MSFT.REGEXP_REPLACE

แทนที่ข้อความที่ตรงกัน โดยค่าเริ่มต้น มันจะแทนที่ทุกคู่ตรงกันและแทรกข้อความแทนที่แบบตรงตัว

อาร์กิวเมนต์ ไวยากรณ์
3 MSFT.REGEXP_REPLACE(source, pattern, [EXACT \| TEMPLATE] replacement)
4 MSFT.REGEXP_REPLACE(source, pattern, [EXACT \| TEMPLATE] replacement, start)
5 MSFT.REGEXP_REPLACE(source, pattern, [EXACT \| TEMPLATE] replacement, start, occurrence)
6 MSFT.REGEXP_REPLACE(source, pattern, [EXACT \| TEMPLATE] replacement, start, occurrence, flags)

source เป็นสตริงที่ต้องการแก้ไข และ pattern ระบุการจับคู่ replacement คือข้อความที่ถูกแทรกสําหรับแมตช์ที่เลือก EXACT แทรกมันเข้าไปโดยตรง; TEMPLATE ตีความการอ้างอิงการจับภาพ

start คือตําแหน่งจุดรหัส Unicode ที่เริ่มต้นด้วยการแทนที่ การแข่งขันต้องเริ่มที่ตําแหน่งนี้หรือหลังจากนั้น ข้อความก่อนหน้า start จะถูกเก็บรักษาไว้โดยไม่เปลี่ยนแปลง และตําแหน่งจะไม่กลายเป็นจุดเริ่มต้นใหม่ของสตริงสําหรับลวดลายที่ยึดติด ตั้งค่า occurrence เป็น เพื่อ 0 แทนที่ทุกการจับคู่ตั้งแต่ start, หรือเป็นค่าบวกเพื่อแทนที่เฉพาะการจับคู่ที่มีหมายเลขและไม่ทับซ้อนกันเท่านั้น การแข่งขัน start ก่อนหน้าหลังจะยังคงเหมือนเดิมเมื่อเลือกเหตุการณ์เฉพาะ flagsเปลี่ยนพฤติกรรมการจับคู่ตามที่อธิบายไว้ใน กฎและตัวเลือกการจับคู่

RETURN MSFT.REGEXP_REPLACE('a1b2c3', '[0-9]', '#', 0, 2) AS replaced

แทนที่เฉพาะหลักที่สองเท่านั้น ผลลัพธ์คือ a1b#c3.

หากไม่พบการจับคู่ สตริงต้นทางจะถูกส่งคืนโดยไม่เปลี่ยนแปลง

หากต้องการใช้ข้อความที่ตรงกันซ้ําในข้อความแทนที่ ให้ระบุ TEMPLATE. ในโหมด \0 นี้ จะ \9 อ้างอิงถึงกลุ่มจับคู่และจับทั้งหมด และ \\ แทรกเครื่องหมายแบ็คสแลชแบบตรงตัว ใช้สตริงดิบลิเทอรัลที่เติมคํานําหน้าด้วย @เพื่อส่งการอ้างอิงเหล่านี้โดยไม่หลบหลีกเพิ่มเติม:

RETURN MSFT.REGEXP_REPLACE(
  'John Smith',
  @'([A-Za-z]+) ([A-Za-z]+)',
  TEMPLATE @'\2 \1'
) AS reordered_name

ผลลัพธ์คือSmith John

กฎและตัวเลือกที่ตรงกัน

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

การจับคู่จะพบจากซ้ายไปขวาโดยไม่ทับซ้อนกัน หลังจากจับคู่แบบไม่มีความยาว การจับคู่จะเลื่อนไปอีกหนึ่งจุดรหัส Unicode

ตําแหน่งเริ่มต้นและตําแหน่งที่คืนเป็นการเลื่อนจุดรหัส Unicode แบบศูนย์ หมายเลขการเกิดขึ้นเป็นแบบฐานเดียว ยกเว้นว่าการเกิดขึ้น0หมายถึงการแทนที่ทุกการเกิดขึ้นในMSFT.REGEXP_REPLACE

ตารางต่อไปนี้แสดงค่าเริ่มต้นสําหรับอาร์กิวเมนต์เสริมที่ถูกละเว้น:

Function Defaults
MSFT.REGEXP_LIKE ธงว่างเปล่า
MSFT.REGEXP_COUNT Start คือ 0; ธงว่างเปล่า
MSFT.REGEXP_INSTR Start คือ 0; การเกิดขึ้นคือ 1; ตัวเลือกการคืนค่าคือ 0; ธงว่างเปล่า; กลุ่มคือ 0.
MSFT.REGEXP_SUBSTR Start คือ 0; occurnce คือ 1; flags ว่างเปล่า; กลุ่มคือ 0.
MSFT.REGEXP_REPLACE โหมดคือ EXACT; start คือ 0; occurnce คือ 0; flags ว่างเปล่า

ธงเสริมได้แก่:

ค่าสถานะ พฤติกรรม
i จับคู่โดยไม่คํานึงถึงกรณี
m จับคู่^$จุดเริ่มต้นและจุดสิ้นสุดของแต่ละบรรทัด
s ทําให้ . ตัวอักษรบรรทัดใหม่ตรงกัน

รวมแฟล็กในสตริงเดียว เช่น 'ims'. แหล่งที่มา null จะคืนค่า null ธงที่ไม่รองรับ, นิพจน์ปกติไม่ถูกต้อง, ตัวเลือกการคืนค่าไม่ถูกต้อง หรือการเกิดหรือหมายเลขกลุ่มไม่ถูกต้อง จะคืนค่าข้อผิดพลาด

ฟังก์ชันกราฟ

  • nodes(path) - แสดงโหนดจากค่าเส้นทาง
  • edges(path) - ส่งกลับขอบจากค่าเส้นทาง
  • elements(path) - ส่งกลับโหนดและขอบทั้งหมดจากเส้นทางเป็นรายการเดียวในลําดับเส้นทาง
  • labels(node_or_edge) - ส่งกลับป้ายชื่อของโหนดหรือขอบเป็นรายการของสตริง
  • path_length(path) - ส่งกลับจํานวนขอบในเส้นทาง
  • element_id(node_or_edge) - คืนค่าโหนดหรือตัวระบุขอบเป็นสตริงทึบแสง

ELEMENT_ID รับการอ้างอิงโหนดหรือขอบและคืนค่า null สําหรับอินพุตที่เป็น null ถือว่าสตริงที่กลับมาเป็นข้อความทึบแสง

ตัวอย่าง:

MATCH p=(:Company)<-[:workAt]-(:Person)-[:knows]-{1,3}(:Person)-[:workAt]->(:Company)
RETURN nodes(p) AS chain_of_colleagues, path_length(p) AS hops

ฟังก์ชันรายการ

  • size(list) - แสดงขนาดของค่ารายการ
  • trim(list,n)- ตัดแต่งรายการให้เหลือจํานวนสมาชิกสูงสุดn

ตัวอย่าง:

MATCH (p:Person)-[:hasInterest]->(t:Tag)
LET personId = p.id, personName = p.firstName
RETURN personId, personName, collect_list(t.name) AS interests
GROUP BY personId, personName
FILTER size(interests) > 3

ฟังก์ชันชั่วคราว

  • CURRENT_TIMESTAMP - ส่งกลับวันที่เวลาที่กําหนดเขตปัจจุบัน
  • ZONED_DATETIME(string) - คืนค่า datetime แบบโซนที่แสดงโดยสตริง ISO 8601
  • DURATION(string) - ส่งคืนระยะเวลากลางวันที่แสดงโดยสตริงระยะเวลา ISO 8601

ตัวอย่าง:

RETURN CURRENT_TIMESTAMP AS now,
       DURATION('PT2H') AS twoHours

ใช้ตัวดําเนินการลบเพื่อหาระยะเวลาระหว่างสองวันที่ที่แบ่งโซน:

RETURN ZONED_DATETIME('2026-09-17T12:00:00Z')
       - ZONED_DATETIME('2026-09-17T10:00:00Z') AS elapsed

Important

กราฟรองรับระยะเวลาตามเวลากลางวัน แต่ไม่รองรับระยะเวลาปี-เดือน DURATION_BETWEEN(start, end) ไม่รองรับในขณะนี้;ลบค่า datetime ที่โซนไว้สองค่าแทน

ฟังก์ชันทั่วไป

  • coalesce(value1, value2, ...) - ส่งกลับค่าแรกที่ไม่ใช่ null
  • to_json_string(value) - แปลงค่าเป็นการแสดงสตริง JSON

ตัวอย่าง:

MATCH (p:Person)
RETURN coalesce(p.firstName, 'Unknown') AS display_name,
       to_json_string(p) AS person_json