Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Redis

RedisGraph 2.8 ออกแล้ว!

วันนี้เรามีความยินดีที่จะประกาศเปิดตัว RedisGraph 2.8 ความพร้อมใช้งานทั่วไป โพสต์บล็อกนี้ให้รายละเอียดเกี่ยวกับคุณลักษณะใหม่ที่สำคัญที่มีให้บริการในขณะนี้

เกี่ยวกับ RedisGraph

RedisGraph เป็นโครงสร้างข้อมูลกราฟที่เน้นหน่วยความจำเป็นอันดับแรกสำหรับ Redis RedisGraph รองรับการเช่าหลายกราฟ (สามารถเก็บกราฟได้จำนวนมากพร้อมกัน) และสามารถให้บริการลูกค้าหลายรายที่เข้าถึงกราฟได้พร้อมกัน ตอนนี้มีให้ใช้งานโดยเป็นส่วนหนึ่งของ Redis Stack

ฟีเจอร์ใหม่ที่สำคัญใน RedisGraph 2.8

  • รูปแบบกราฟที่สมบูรณ์ยิ่งขึ้น
    • โหนดที่มีป้ายกำกับหลายรายการ
  • เพิ่มความสามารถในการสืบค้นข้อมูล
    • ปรับปรุงการค้นหาข้อความแบบเต็ม
    • รองรับโครงสร้าง ฟังก์ชัน และตัวดำเนินการ Cypher เพิ่มเติม
  • ปรับปรุงประสิทธิภาพ
    • ดัชนีเหนือคุณสมบัติของความสัมพันธ์
    • เดลต้าเมทริกซ์
    • บัฟเฟอร์การสร้างโหนดที่ควบคุมได้
    • เกณฑ์มาตรฐาน

https://redis.com/blog/redisgraph-2-8-is-generally-available/(เปิดในแท็บใหม่)

รูปแบบกราฟที่สมบูรณ์ยิ่งขึ้น

โหนดที่มีป้ายกำกับหลายรายการ

คำจำกัดความมากมายของแบบจำลองข้อมูลกราฟคุณสมบัติที่มีป้ายกำกับ (LPG) (เช่น แบบจำลองฐานข้อมูลกราฟคุณสมบัติ – มุม 2018 และร่าง ISO/IEC JTC 1/SC 32 – GQL) ระบุว่าโหนดสามารถมีป้ายกำกับได้หลายป้าย RedisGraph รองรับเพียงป้ายกำกับเดียวจนถึงเวอร์ชัน 2.8 ณ ตอนนี้ เราสามารถเพิ่มป้ายกำกับได้หลายป้ายในแต่ละโหนดโดยไม่ลดประสิทธิภาพการทำงานหรือหน่วยความจำเพิ่มขึ้นอย่างมาก

ในการสร้างโหนดที่มีป้ายกำกับหลายรายการ คุณเพียงแค่แสดงรายการป้ายกำกับทั้งหมดที่คั่นด้วยเครื่องหมายทวิภาค:

GRAPH.QUERY g "CREATE (e:Employee:BoardMember {Name:'Vincent Chan', Title:'Web marketing lead'}) return e"

หากต้องการจับคู่โหนดที่มีป้ายกำกับหลายรายการ (เงื่อนไข AND) คุณควรใช้เครื่องหมายโคลอนเดียวกันเช่นกัน:

GRAPH.QUERY g "MATCH (e:Employee:BoardMember) return e"

ปรับปรุงความสามารถในการสืบค้น

ปรับปรุงการค้นหาข้อความแบบเต็ม

RedisGraph มาพร้อมกับ RedisSearch และใช้ประโยชน์จากการจัดทำดัชนีรอง แต่ยังสามารถใช้สำหรับการจัดทำดัชนีและการค้นหาขั้นสูงได้อีกด้วย ตัวอย่างเช่น ค้นหาโหนดตามความใกล้ชิดทางภูมิศาสตร์กับจุดที่กำหนดบนโลก หรือให้คะแนนรายการที่เกี่ยวข้องสูงขึ้น

เวอร์ชัน 2.8 เพิ่มตัวเลือกการกำหนดค่าภาษาและคำหยุด ภาษากำหนดภาษาที่จะใช้สำหรับการสร้างข้อความ ซึ่งเป็นการเพิ่มรูปแบบพื้นฐานของคำลงในดัชนี ซึ่งจะทำให้แบบสอบถามสำหรับ "going" สามารถส่งคืนผลลัพธ์สำหรับ "go" และ "gone" เป็นต้น คำหยุดเป็นคำทั่วไป (เช่น “is, the, an, and…”) ซึ่งไม่ได้เพิ่มข้อมูลในการค้นหามากนักแต่กินพื้นที่ในดัชนีค่อนข้างมาก คำเหล่านี้จะไม่ถูกสร้างดัชนีและละเว้นเมื่อทำการค้นหา คำค้นหาที่มีคำหยุดอยู่ในนั้น เช่น "ในปารีส" จะถูกมองว่าเป็น "ปารีส" เท่านั้น

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

GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex({ label:'Movie', ภาษา:'German', คำหยุด:['a', 'ab'] }, 'title')" 

RediSearch มีตัวเลือกการกำหนดค่าช่องเพิ่มเติม 3 ตัวเลือก: 

  • น้ำหนัก – ความสำคัญของข้อความในช่อง
  • nostem – ข้ามการต่อท้ายเมื่อสร้างดัชนีข้อความ
  • สัทศาสตร์ – เปิดใช้งานการค้นหาแบบออกเสียงบนข้อความ

ในการสร้างดัชนีข้อความแบบเต็มในคุณสมบัติชื่อด้วยการค้นหาแบบออกเสียงของโหนดทั้งหมดที่มีป้ายกำกับ ภาพยนตร์:

GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex('Movie', {field:'title', phonetic:'dm:en'})"

รองรับโครงสร้าง ฟังก์ชัน และตัวดำเนินการ Cypher เพิ่มเติม

RedisGraph 2.8 ขยายการรองรับ Cypher:

  • ความเข้าใจรูปแบบ
  • เพิ่มการรองรับ
    allShortestPaths
    ฟังก์ชัน
  • ฟังก์ชัน Cypher:
    คีย์ ลด แทนที่ ไม่มี
    และ
    ซิงเกิ้ล
  • การคัดลอกชุดแอตทริบิวต์โหนดใน
    SET
    อนุประโยค
  • กรองตามป้ายกำกับโหนดใน
    WHERE
    อนุประโยค
  • ตัวดำเนินการ Cypher:
    XOR
    และ
    ^ 

ความเข้าใจรูปแบบ

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

MATCH
ประโยคโดยมีภาคแสดงเหมือนในมาตรฐาน
WHERE
ข้อ แต่ให้ผลการฉายที่ระบุ

ตัวอย่างเช่น แบบสอบถามต่อไปนี้จะส่งคืนรายการที่มีประเภทการให้ทุนทั้งหมดที่ได้รับโดยพนักงานชาย โดยที่จำนวนเงินให้สิทธิ์มากกว่า $1,000

GRAPH.QUERY g "CREATE (e:Employee {gender:'Male'})-[:granted]->(g:Grant {type:'Research', amount:2000})"

GRAPH.QUERY g "MATCH (e:Employee {gender:'Male'}) RETURN [(e)-[:granted]->(g:Grant) WHERE g.amount> 1000 | g.type] AS GrantTypes"

เพิ่มการสนับสนุนสำหรับ allShortestPaths ฟังก์ชัน

allShortestPaths
ฟังก์ชันส่งคืนเส้นทางที่สั้นที่สุดระหว่างคู่ของเอนทิตีที่ตรงกับเกณฑ์ทั้งหมด เอนทิตีทั้งสองต้องถูกผูกไว้ก่อนหน้า
WITH
-กำหนดขอบเขต

GRAPH.QUERY DEMO_GRAPH "MATCH (c:Actor {name:'Charlie Sheen'}), (k:Actor {name:'Kevin Bacon'}) WITH c, k MATCH p =allShortestPaths((c)-[ :PLAYED_WITH*]->(k)) RETURN nodes(p) ในฐานะนักแสดง"

ข้อความค้นหานี้จะสร้างเส้นทางทั้งหมดที่มีความยาวขั้นต่ำที่เชื่อมต่อโหนดนักแสดงที่เป็นตัวแทนของ Charlie Sheen กับเส้นทางที่เป็นตัวแทนของ Kevin Bacon มีเส้นทางแบบ 2 ฮอปหลายเส้นทางระหว่างนักแสดงสองคน และทั้งหมดนี้จะถูกส่งคืน การคำนวณเส้นทางจะสิ้นสุดลง เนื่องจากเราไม่สนใจเส้นทางใดที่มีความยาวมากกว่า 2

อาจระบุความยาวขั้นต่ำ (ต้องเป็น 1) และความยาวสูงสุด (อย่างน้อย 1) สำหรับการค้นหา อาจมีการระบุประเภทความสัมพันธ์ตั้งแต่ศูนย์ขึ้นไป (เช่น

[:R|Q*1..3]
). ห้ามใช้ตัวกรองคุณสมบัติในรูปแบบ

เพิ่มการสนับสนุนสำหรับ กุญแจ ฟังก์ชัน Cypher

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

MATCH (a) คีย์ RETURN (a) 
MATCH ()-[e]->() คีย์ย้อนกลับ (e)
คีย์ RETURN ({a:1, b:2})

เพิ่มการสนับสนุนสำหรับ ลด ฟังก์ชัน Cypher

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

GRAPH.QUERY g "RETURN reduce(sum =0, n IN range(1,10) | sum + n)"

ผลลัพธ์ของฟังก์ชันนี้จะเป็น 55 – ผลรวมของจำนวนเต็มระหว่าง 1 ถึง 10

GRAPH.QUERY g "RETURN reduce(arr =[], n IN range(1,10) | arr + [n*n])"

ผลลัพธ์ของฟังก์ชันนี้จะเป็นอาร์เรย์ที่มีกำลังสองของจำนวนเต็มระหว่าง 1 ถึง 10

เพิ่มการรองรับการแทนที่ฟังก์ชันสตริง Cypher

แทนที่การเกิดขึ้นทั้งหมดของสตริงย่อยที่กำหนดด้วยสตริงย่อยอื่น ฟังก์ชันได้รับพารามิเตอร์ 3 ตัว ได้แก่ สตริงเดิม รายการที่จะแทนที่ และรายการที่จะแทนที่ด้วย

GRAPH.QUERY g "RETURN replace('abc*efg', '*', 'd')"

ค่าที่ส่งคืนจะเป็น 'abcdefg'

ฟังก์ชันนี้ยังสามารถลบสตริงย่อยได้ด้วยการแทนที่ด้วยสตริงว่าง (‘’)

เพิ่มการสนับสนุนสำหรับ ไม่มี และ โสด ฟังก์ชัน Cypher

เมื่อระบุรายการ จะไม่มีการคืนค่าใดเป็น จริง หากเพรดิเคตไม่มีองค์ประกอบใด ๆ ในขณะที่รายการเดียว คืนค่า จริง หากเพรดิเคตที่ระบุมีองค์ประกอบเพียงรายการเดียว

GRAPH.QUERY g "RETURN none(x IN range(1,10) WHERE x>10)" 
GRAPH.QUERY g "RETURN single(x IN range(1,10) WHERE x>9)"

ฟังก์ชันเหล่านี้คล้ายกับฟังก์ชันทั้งหมดและทุกฟังก์ชัน

กรณีการใช้งานที่เป็นไปได้อย่างหนึ่งคือการกรองเส้นทาง:

graph.query DEMO_GRAPH “MATCH p =(a {name:'Johnny Depp'})-[*2..5]->(b {name:'Kevin Bacon'}) WHERE none(n IN nodes(p) WHERE น.ปี> 2513) ผลตอบแทน p”

ข้อความค้นหานี้จะส่งคืนเส้นทางทั้งหมดที่มีความยาว 2 ถึง 5 จาก Johnny Depp ถึง Kevin Bacon ซึ่งรวมถึงไม่มีนักแสดงที่เกิดหลังปี 1970

เพิ่มการรองรับการคัดลอกชุดแอตทริบิวต์โหนดใน

SET
อนุประโยค

SET
สามารถใช้แทนหรือผนวกค่าคุณสมบัติทั้งหมดของโหนดหนึ่งกับค่าคุณสมบัติของโหนดอื่นได้

แบบสอบถามต่อไปนี้จะจับคู่สองเอนทิตี แล้วแทนที่คุณสมบัติของ a ทั้งหมดด้วยคุณสมบัติของ b:

GRAPH.QUERY g "MATCH (a {v:1}), (b {v:2}) SET a =b"

แบบสอบถามต่อไปนี้จะจับคู่สองเอนทิตี แล้วเพิ่ม (หรือแทนที่ค่า) ของคุณสมบัติของ a ด้วยคุณสมบัติของ b

GRAPH.QUERY g "MATCH (a {v:1}), (b {v:2}) SET a +=b"

นอกจากนี้เรายังสามารถเปลี่ยนประเภทของความสัมพันธ์โดยไม่ต้องเปลี่ยนคุณสมบัติ:

GRAPH.QUERY g "MATCH (a)-[b]->(c) WHERE ID(b)=0 CREATE (a)-[d:bar]->(c) SET d=b DELETE b RETURN ง"

เพิ่มการรองรับการกรองตามป้ายกำกับโหนดใน ที่ไหน ประโยค

ขณะนี้สามารถกรองตามป้ายกำกับโหนดหรือประเภทความสัมพันธ์ได้ในส่วนคำสั่ง WHERE:

GRAPH.QUERY g "MATCH (a) WHERE a:L RETURN a" 
GRAPH.QUERY g "MATCH (a)-[b]-(c) WHERE b:L RETURN b"

เพิ่มการรองรับสำหรับตัวดำเนินการ Cypher XOR และ ^

GRAPH.QUERY g "RETURN true XOR true" 
GRAPH.QUERY g "RETURN 2 ^ 3”

ผลลัพธ์

เท็จ
และ
8
ตามลำดับ

ปรับปรุงประสิทธิภาพ

ดัชนีเหนือคุณสมบัติของความสัมพันธ์

สำหรับโหนด เราสามารถแนะนำดัชนีโดยออกคำสั่งต่อไปนี้

GRAPH.QUERY g "CREATE INDEX FOR (n:GRANTS) ON (n.GrantedBy)"

ขณะนี้สามารถแนะนำดัชนีสำหรับความสัมพันธ์ได้เช่นกัน:

GRAPH.QUERY g "CREATE INDEX FOR ()-[r:R]-() ON (r.prop)"

พิจารณาคำถามต่อไปนี้:

GRAPH.QUERY g "MATCH (a)-[r:R {prop:5}]-(b) return *"

สังเกตแผนปฏิบัติการก่อนสร้างดัชนี:

redis:6379> GRAPH.EXPLAIN g "MATCH (a)-[r:R {prop:5}]-(b) return *"

1) "ผลลัพธ์" 
2) "    โครงการ"
3) "        ตัวกรอง"
4) "            Conditional Traverse | (a)-[r:R]->(b)"
5) "                All Node Scan | (a)"

และนี่คือแผนการดำเนินการสำหรับแบบสอบถามเดียวกันหลังจากสร้างดัชนี:

redis:6379> GRAPH.EXPLAIN g "MATCH (a)-[r:R {prop:5}]-(b) return *"

1) "ผลลัพธ์" 
2) "    โครงการ"
3) "        Edge By Index Scan | [r:R]"

เดลต้าเมทริกซ์

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

ใน RedisGraph กราฟจะแสดงด้วยเมทริกซ์ที่อยู่ติดกัน ป้ายกำกับโหนดและทุกประเภทความสัมพันธ์ในกราฟมีเมทริกซ์ของตัวเอง ก่อนหน้านี้ ทุกครั้งที่มีการเพิ่มโหนดใหม่ลงในกราฟ เมทริกซ์ทั้งหมดจำเป็นต้องปรับขนาด และฐานข้อมูลที่ใหญ่ขึ้น ก็ยิ่งใช้เวลามากขึ้นเท่านั้น

RedisGraph 2.8 ออกแล้ว!

ตั้งแต่ v2.8 เวลาที่ใช้ในการแทรกโหนดใหม่และความสัมพันธ์จะน้อยลงอย่างมาก และไม่ขึ้นอยู่กับขนาดของกราฟอีกต่อไป การปรับให้เหมาะสมนี้ทำได้โดยการแนะนำเมทริกซ์เดลต้าสองตัวสำหรับทุกเมทริกซ์ในกราฟ:อันหนึ่งสำหรับการเพิ่มโหนด (D+) และอีกอันสำหรับการลบโหนด (D-) การเพิ่มและการลบโหนดจะแสดงในเมทริกซ์เดลต้าที่เหมาะสม และเมื่อเมทริกซ์เดลต้าถึงขีดจำกัด 10,000 โหนด (กำหนดค่าได้ผ่าน

DELTA_MAX_PENDING_CHANGES
พารามิเตอร์การกำหนดค่า) จะซิงโครไนซ์กับเมทริกซ์หลักในการดำเนินการเป็นกลุ่มเดียว ว่าง และรอบเดียวกันสามารถเริ่มต้นใหม่ได้อีกครั้ง

บัฟเฟอร์การสร้างโหนดที่ควบคุมได้

พารามิเตอร์การกำหนดค่าเวลาในการโหลดใหม่ NODE_CREATION_BUFFER ควบคุมจำนวนหน่วยความจำที่สงวนไว้ในเมทริกซ์สำหรับการสร้างโหนดในอนาคต ตัวอย่างเช่น เมื่อตั้งค่าเป็น 16,384 เมทริกซ์จะมีพื้นที่เพิ่มเติมสำหรับโหนด 16384 เมื่อสร้าง เมื่อใดก็ตามที่พื้นที่ส่วนเกินหมด ขนาดของเมทริกซ์จะเพิ่มขึ้น 16384

การลดค่านี้จะลดการใช้หน่วยความจำ แต่ทำให้ประสิทธิภาพลดลงเนื่องจากความถี่ที่เพิ่มขึ้นของการจัดสรรใหม่ของเมทริกซ์ ในทางกลับกัน การเพิ่มขึ้นอาจช่วยปรับปรุงประสิทธิภาพสำหรับเวิร์กโหลดที่มีการเขียนมากแต่จะเพิ่มการใช้หน่วยความจำ

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

เกณฑ์มาตรฐาน

เรายังได้เพิ่มการปรับปรุงประสิทธิภาพอื่นๆ อีกมากมายนอกเหนือจากเมทริกซ์เดลต้า เราสาธิตการปรับปรุงเหล่านี้ด้านล่างโดยใช้เกณฑ์มาตรฐาน LDBC SNB
LDBC SNB (Linked Data Benchmark Council – Social Network Benchmarks) เป็นเกณฑ์มาตรฐานอุตสาหกรรมสำหรับการเปรียบเทียบปริมาณงานการอ่านและเขียนฐานข้อมูลแบบกราฟในโลกแห่งความเป็นจริง

โหลดข้อมูลโดยรวมเร็วขึ้นมากใน RedisGraph 2.8:

  • ตัวคูณสเกล LDBC 1:
    RedisGraph 2.8 เร็วกว่า RedisGraph 2.4 . 1.92 เท่า
  • ตัวคูณสเกล LDBC 10:
    RedisGraph 2.8 เร็วกว่า RedisGraph 2.4 2.00 เท่า
RedisGraph 2.8 ออกแล้ว!

การสืบค้น LDBC (ทั้งการอ่านและการเขียน) ดำเนินการเร็วกว่ามากใน RedisGraph 2.8:

  • อ่านข้อความค้นหา:
    RedisGraph 2,8 เร็วกว่า RedisGraph 2.4 . 2.32 เท่า
  • เขียนคำถาม:
    RedisGraph 2,8 เร็วกว่า RedisGraph 2.4 ถึง 1.09 เท่า
RedisGraph 2.8 ออกแล้ว!

การกู้คืนและการซิงค์ข้อมูล (RDB และ AOF) นั้นเร็วกว่ามากเช่นกัน (ขึ้นอยู่กับลำดับความสำคัญเร็วขึ้นหลายระดับในบางสถานการณ์)

RedisGraph เป็นส่วนหนึ่งของ Redis Stack

RedisGraph เป็นส่วนหนึ่งของ Redis Stack แล้ว คุณสามารถดาวน์โหลดไบนารี Redis Stack Server ล่าสุดสำหรับ macOS, Ubuntu หรือ Redhat หรือติดตั้งด้วย Docker, Homebrew หรือ Linux

สัมผัสประสบการณ์ RedisGraph โดยใช้ RedisInsight

RedisInsight เป็นเครื่องมือภาพสำหรับนักพัฒนาที่มอบวิธีที่ยอดเยี่ยมในการสำรวจข้อมูลจาก RedisTimes ระหว่างการพัฒนาโดยใช้ Redis หรือ Redis Stack

RedisGraph 2.8 ออกแล้ว!

คุณสามารถดำเนินการสืบค้นข้อมูลแบบกราฟและสังเกตผลลัพธ์ได้โดยตรงจากส่วนต่อประสานกราฟิกกับผู้ใช้ RedisInsight สามารถแสดงภาพผลลัพธ์การสืบค้น RedisGraph ได้แล้ว

RedisGraph 2.8 ออกแล้ว!

นอกจากนี้ RedisInsight ยังมีคำแนะนำและบทช่วยสอนฉบับย่อสำหรับการเรียนรู้ RedisGraph แบบโต้ตอบ

เรียนรู้เพิ่มเติมเกี่ยวกับ RedisGraph บน redis.io และ developer.redis.com