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