Computer >> Máy Tính >  >> Lập trình >> Redis

RedisGraph 2.8 đã ra mắt!

Hôm nay, chúng tôi vui mừng thông báo về bản phát hành Tính sẵn có chung của RedisGraph 2.8. Bài đăng trên blog này nêu chi tiết về các tính năng mới chính hiện đã có sẵn.

Giới thiệu về RedisGraph

RedisGraph là một cấu trúc dữ liệu đồ thị hiệu suất cao, ưu tiên bộ nhớ cho Redis. RedisGraph hỗ trợ cho thuê nhiều đồ thị (nó có thể chứa nhiều đồ thị đồng thời) và có thể phục vụ nhiều khách hàng truy cập đồ thị đồng thời. Nó hiện cũng có sẵn như một phần của Redis Stack.

Các tính năng mới chính trong RedisGraph 2.8

  • Mô hình đồ thị phong phú hơn
    • Các nút nhiều nhãn
  • Khả năng truy vấn nâng cao
    • Tìm kiếm toàn văn bản nâng cao
    • Hỗ trợ nhiều cấu trúc, hàm và toán tử Cypher hơn
  • Cải tiến hiệu suất
    • Chỉ mục trên các thuộc tính của mối quan hệ
    • Ma trận Delta
    • Bộ đệm tạo nút có thể điều khiển
    • Điểm chuẩn

https://redis.com/blog/redisgraph-2-8-is-generally-available/ (mở trong tab mới)

Mô hình biểu đồ phong phú hơn

Các nút nhiều nhãn

Nhiều định nghĩa về mô hình dữ liệu Đồ thị thuộc tính được gắn nhãn (LPG) (ví dụ: Mô hình cơ sở dữ liệu đồ thị thuộc tính - Angles, 2018 và dự thảo ISO / IEC JTC 1 / SC 32 - GQL) chỉ định rằng một nút có thể có nhiều nhãn. Cho đến v2.8, RedisGraph chỉ hỗ trợ một nhãn duy nhất. Hiện tại, chúng tôi có thể thêm nhiều nhãn vào mỗi nút mà không làm giảm hiệu suất hoặc tăng bộ nhớ đáng kể.

Để tạo một nút có nhiều nhãn, bạn chỉ cần liệt kê tất cả các nhãn được phân tách bằng dấu hai chấm:

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

Để đối sánh một nút có nhiều nhãn (điều kiện AND), bạn cũng nên sử dụng cùng một ký hiệu dấu hai chấm:

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

Khả năng truy vấn nâng cao

Tìm kiếm toàn văn bản nâng cao

RedisGraph được nhúng với RedisSearch và được sử dụng để lập chỉ mục phụ nhưng nó cũng có thể được sử dụng để lập chỉ mục và tìm kiếm nâng cao. Ví dụ - tìm các nút dựa trên khoảng cách địa lý với một điểm nhất định trên trái đất hoặc cho điểm các mục liên quan cao hơn.

Phiên bản 2.8 thêm các tùy chọn cấu hình ngôn ngữ và từ dừng. ngôn ngữ xác định ngôn ngữ nào sẽ sử dụng cho văn bản gốc - tức là thêm dạng cơ sở của một từ vào chỉ mục. Điều này cho phép truy vấn cho "going" cũng trả về kết quả cho "go" và "gone", chẳng hạn. từ dừng là những từ rất phổ biến (như “is, the, an, and…”) không bổ sung nhiều thông tin để tìm kiếm nhưng chiếm nhiều không gian trong chỉ mục. Những từ này không được lập chỉ mục và bỏ qua khi tìm kiếm. Cụm từ truy vấn có từ khóa, chẳng hạn như “ở Paris” sẽ chỉ được xem là “Paris”.

Để tạo chỉ mục toàn văn trên thuộc tính tiêu đề của phim bằng tiếng Đức và sử dụng từ dừng tùy chỉnh của tất cả các nút có nhãn Phim:

 GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex ({label:'Movie', language:'German', stopwords:['a', 'ab']}, 'title')"  

RediSearch cung cấp 3 tùy chọn cấu hình trường bổ sung:

  • trọng lượng - tầm quan trọng của văn bản trong trường
  • nostem - bỏ qua phần gốc khi lập chỉ mục văn bản
  • ngữ âm - cho phép tìm kiếm ngữ âm trên văn bản

Để tạo chỉ mục toàn văn trên thuộc tính tiêu đề bằng cách tìm kiếm phiên âm của tất cả các nút có nhãn Phim:

 GRAPH.QUERY DEMO_GRAPH "CALL db.idx.fulltext.createNodeIndex ('Movie', {field:'title', phiên âm:'dm:en'})" 

Hỗ trợ nhiều cấu trúc, hàm và toán tử Cypher hơn

RedisGraph 2.8 mở rộng phạm vi hỗ trợ Cypher:

  • Hiểu mẫu
  • Thêm hỗ trợ cho
     allShortestPaths 
    chức năng
  • Chức năng Cypher:phím
    , giảm, thay thế, không có, 
     đơn 
  • Sao chép tập thuộc tính nút trong
     SET 
    mệnh đề
  • Lọc theo nhãn nút trong
     WHERE 
    mệnh đề
  • Toán tử Cypher:
     XOR 
      ^  

Hiểu mẫu

Hiểu mẫu là một cấu trúc cú pháp có sẵn trong Cypher. Mặc dù hiểu danh sách cho phép chúng tôi tạo danh sách dựa trên danh sách hiện có, nhưng hiểu mẫu là một cách để điền vào danh sách các kết quả so khớp của một mẫu. Nó sẽ khớp với mẫu được chỉ định như trong

 MATCH 
tiêu chuẩn mệnh đề, với các vị từ như trong một
 WHERE 
tiêu chuẩn nhưng mang lại một phép chiếu cụ thể.

Ví dụ:truy vấn sau sẽ trả về một danh sách chứa tất cả các loại tài trợ mà nhân viên nam nhận được trong đó số tiền trợ cấp lớn hơn $ 1000.

 GRAPH.QUERY g "CREATE (e:Nhân viên {giới tính:'Nam'}) - [:cấp] -> (g:Cấp {loại:'Nghiên cứu', số tiền:2000})" 

 GRAPH.QUERY g "MATCH (e:Nhân viên {giới tính:'Nam'}) QUAY LẠI [(e) - [:CẤP] -> (g:Cấp) WHERE g.amount> 1000 | g.type] NHƯ GrantTypes "

Thêm hỗ trợ cho allShortestPaths chức năng

 allShortestPaths 
hàm trả về tất cả các đường đi ngắn nhất giữa một cặp thực thể phù hợp với tất cả các tiêu chí. Cả hai thực thể phải được ràng buộc trong một
 WITH 
trước đó -phạm vi phân định.

 GRAPH.QUERY DEMO_GRAPH "MATCH (c:Actor {name:'Charlie Sheen'}), (k:Actor {name:'Kevin Bacon'}) VỚI c, k MATCH p =allShortestPaths ((c) - [ :PLAYED_WITH *] -> (k)) QUAY LẠI các nút (p) với tư cách là tác nhân "

Truy vấn này sẽ tạo ra tất cả các đường có độ dài tối thiểu nối nút diễn viên đại diện cho Charlie Sheen với nút đại diện cho Kevin Bacon. Có một số con đường 2 bước giữa hai diễn viên và tất cả những điều này sẽ được quay lại. Việc tính toán các đường dẫn sau đó chấm dứt, vì chúng tôi không quan tâm đến bất kỳ đường dẫn nào có độ dài lớn hơn 2.

Có thể chỉ định độ dài tối thiểu (phải bằng 1) và độ dài tối đa (ít nhất là 1) cho tìm kiếm. Không hoặc nhiều loại mối quan hệ có thể được chỉ định (ví dụ:

 [:R | Q * 1..3] 
). Không có bộ lọc thuộc tính nào có thể được giới thiệu trong mẫu này.

Thêm hỗ trợ cho phím Hàm Cypher

Các phím

 
hàm chấp nhận một nút, một mối quan hệ hoặc một bản đồ làm đầu vào và trả về một mảng gồm tất cả các khóa mà đầu vào chứa.

Các phím

 MATCH (a) RETURN (a) 
Các phím MATCH () - [e] -> () RETURN (e)
Phím RETURN ({a:1, b:2})

Thêm hỗ trợ cho giảm Hàm Cypher

 giảm 
hàm chấp nhận một giá trị bắt đầu và một danh sách. Sau đó, nó cập nhật giá trị bằng cách đánh giá một biểu thức so với từng phần tử của danh sách.

 GRAPH.QUERY g "QUAY LẠI giảm (sum =0, n TRONG phạm vi (1,10) | sum + n)" 

Đầu ra của hàm này sẽ là 55 - tổng của các số nguyên từ 1 đến 10.

 GRAPH.QUERY g "QUAY LẠI giảm (arr =[], n TRONG phạm vi (1,10) | arr + [n * n])" 

Đầu ra của hàm này sẽ là một mảng chứa các bình phương của các số nguyên từ 1 đến 10.

Thêm hỗ trợ để thay thế hàm chuỗi Cypher

Thay thế tất cả các lần xuất hiện của một chuỗi con đã cho bằng một chuỗi khác. Hàm nhận 3 tham số:chuỗi gốc, các lần xuất hiện để thay thế và thay thế chúng bằng gì.

 GRAPH.QUERY g "QUAY LẠI thay thế ('abc * efg', '*', 'd')" 

Giá trị trả về sẽ là ‘abcdefg’.

Hàm này cũng có thể xóa các chuỗi con bằng cách thay thế chúng bằng một chuỗi rỗng (‘’).

Thêm hỗ trợ cho không đơn Hàm Cypher

Cho một danh sách, không có giá trị nào trả về true nếu một vị từ không giữ cho bất kỳ phần tử nào, trong khi một giá trị trả về true nếu vị từ đã cho chỉ giữ một phần tử.

 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)"

Các chức năng này tương tự với tất cả và bất kỳ chức năng nào.

Một trường hợp sử dụng có thể có là lọc đường dẫn:

graph.query DEMO_GRAPH “MATCH p =(a {name:'Johnny Depp'}) - [* 2..5] -> (b {name:'Kevin Bacon'}) WHERE none (n nút IN (p) WHERE n.year> 1970) QUAY LẠI p ”

Truy vấn này sẽ trả về tất cả các đường dẫn có độ dài từ 2 đến 5 từ Johnny Depp đến Kevin Bacon, không bao gồm diễn viên sinh sau năm 1970.

Thêm hỗ trợ sao chép tập thuộc tính nút trong

 SET 
mệnh đề

 SET 
mệnh đề có thể được sử dụng để thay thế hoặc nối tất cả các giá trị thuộc tính của một nút với các giá trị thuộc tính của nút khác.

Truy vấn sau sẽ so khớp hai thực thể và sau đó thay thế tất cả thuộc tính của a bằng thuộc tính của b:

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

Truy vấn sau sẽ so khớp hai thực thể và sau đó thêm (hoặc thay thế các giá trị) thuộc tính của a bằng thuộc tính của b.

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

Chúng tôi cũng có thể thay đổi loại mối quan hệ mà không cần thay đổi các thuộc tính:

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

Thêm hỗ trợ lọc theo nhãn nút trong Ở ĐÂU mệnh đề

Bây giờ có thể lọc theo nhãn nút hoặc kiểu quan hệ cũng trong mệnh đề WHERE:

 GRAPH.QUERY g "MATCH (a) WHERE a:L TRẢ LẠI a" 
GRAPH.QUERY g "MATCH (a) - [b] - (c) WHERE b:L TRẢ LẠI b"

Thêm hỗ trợ cho các toán tử Cypher XOR và ^

 GRAPH.QUERY g "TRẢ LẠI true XOR true" 
GRAPH.QUERY g "QUAY LẠI 2 ^ 3"

Kết quả

 false 
 8 
tương ứng.

Cải tiến hiệu suất

Chỉ mục trên thuộc tính mối quan hệ

Đối với các nút, chúng ta có thể giới thiệu một chỉ mục bằng cách đưa ra lệnh sau

 GRAPH.QUERY g "TẠO CHỈ SỐ CHO (n:GRANTS) BẬT (n.GrantedBy)" 

bây giờ cũng có thể giới thiệu các chỉ mục cho các mối quan hệ:

 GRAPH.QUERY g "TẠO CHỈ SỐ CHO () - [r:R] - () ON (r.prop)" 

Hãy xem xét truy vấn sau:

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

Hãy quan sát kế hoạch thực thi trước khi tạo chỉ mục:

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

 1) "Kết quả" 
2) "Dự án"
3) "Bộ lọc"
4) "Traverse có điều kiện | (a) - [r:R] -> (b)"
5) "Quét tất cả nút | (a)"

Và đây là kế hoạch thực thi cho cùng một truy vấn sau khi tạo chỉ mục:

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

 1) "Kết quả" 
2) "Dự án"
3) "Quét theo cạnh bằng chỉ mục | [r:R]"

Ma trận Delta

Kể từ phiên bản 2.8, việc bổ sung và xóa các nút và mối quan hệ nhanh hơn nhiều, vì chúng được cập nhật lần đầu trong ma trận delta nhỏ. Các ma trận chính sau đó được cập nhật hàng loạt.

Trong RedisGraph, đồ thị được biểu diễn bằng ma trận kề. Mọi nhãn nút và mọi kiểu quan hệ trong biểu đồ đều có ma trận riêng. Trước đây, mỗi khi một nút mới được thêm vào biểu đồ, tất cả các ma trận cần được thay đổi kích thước và cơ sở dữ liệu càng lớn thì việc này càng mất nhiều thời gian.

RedisGraph 2.8 đã ra mắt!

Kể từ v2.8, thời gian cần thiết để chèn các nút và mối quan hệ mới về cơ bản nhỏ hơn đáng kể và không phụ thuộc vào kích thước của đồ thị nữa. Sự tối ưu hóa này đạt được bằng cách đưa vào hai ma trận tam giác cho mọi ma trận trong đồ thị:một ma trận cho phép cộng nút (D +) và một ma trận xóa nút (D-). Việc thêm và xóa nút được phản ánh trong ma trận delta thích hợp của chúng và khi ma trận delta đạt đến ngưỡng 10000 nút (có thể định cấu hình thông qua

 DELTA_MAX_PENDING_CHANGES 
tham số cấu hình), nó được đồng bộ hóa với ma trận chính trong một thao tác hàng loạt duy nhất, được làm trống và cùng một chu kỳ có thể bắt đầu lại.

Bộ đệm tạo nút có thể điều khiển

Tham số cấu hình thời gian tải mới, NODE_CREATION_BUFFER, kiểm soát lượng bộ nhớ được dự trữ trong ma trận cho các sáng tạo nút trong tương lai. Ví dụ:khi được đặt thành 16,384, ma trận sẽ có thêm không gian cho 16384 nút khi tạo. Bất cứ khi nào hết dung lượng bổ sung, kích thước của ma trận sẽ tăng thêm 16384.

Giảm giá trị này sẽ làm giảm mức tiêu thụ bộ nhớ, nhưng gây ra suy giảm hiệu suất do tần suất tái phân bổ ma trận tăng lên. Ngược lại, tăng nó có thể cải thiện hiệu suất đối với khối lượng công việc nhiều ghi nhưng sẽ làm tăng mức tiêu thụ bộ nhớ.

Nếu đối số được truyền không phải là lũy thừa của 2, nó sẽ được làm tròn thành lũy thừa lớn nhất tiếp theo của 2 để cải thiện sự liên kết của bộ nhớ.

Điểm chuẩn

Chúng tôi cũng đã thêm nhiều cải tiến hiệu suất khác ngoài ma trận delta. Chúng tôi chứng minh những cải tiến này bên dưới bằng cách sử dụng điểm chuẩn LDBC SNB.
LDBC SNB (Hội đồng điểm chuẩn dữ liệu được liên kết - Điểm chuẩn mạng xã hội) là điểm chuẩn tiêu chuẩn ngành để so sánh khối lượng công việc đọc và ghi trong cơ sở dữ liệu biểu đồ trong thế giới thực.

Tổng thể tải dữ liệu nhanh hơn nhiều trong RedisGraph 2.8:

  • Hệ số thang đo LDBC 1:
    RedisGraph 2.8 nhanh hơn 1,92 lần so với RedisGraph 2.4
  • Hệ số thang đo LDBC 10:
    RedisGraph 2.8 nhanh hơn 2,00 lần so với RedisGraph 2.4
RedisGraph 2.8 đã ra mắt!

Các truy vấn LDBC (cả đọc và ghi) được thực thi nhanh hơn nhiều trong RedisGraph 2.8:

  • Đọc các truy vấn:
    RedisGraph 2,8 nhanh hơn 2,32 lần so với RedisGraph 2,4
  • Viết các truy vấn:
    RedisGraph 2,8 nhanh hơn 1,09 lần so với RedisGraph 2,4
RedisGraph 2.8 đã ra mắt!

Việc khôi phục và đồng bộ hóa dữ liệu (RDB và AOF) cũng nhanh hơn nhiều (nhanh hơn tới một số cấp độ trong một số trường hợp).

RedisGraph là một phần của Redis Stack

RedisGraph hiện là một phần của Redis Stack. Bạn có thể tải xuống các tệp nhị phân Redis Stack Server mới nhất cho macOS, Ubuntu hoặc Redhat hoặc cài đặt bằng Docker, Homebrew hoặc Linux.

Trải nghiệm RedisGraph bằng RedisInsight

RedisInsight là một công cụ trực quan dành cho các nhà phát triển, cung cấp một cách tuyệt vời để khám phá dữ liệu từ RedisTimes trong quá trình phát triển bằng cách sử dụng Redis hoặc Redis Stack.

RedisGraph 2.8 đã ra mắt!

Bạn có thể thực hiện các truy vấn đồ thị và quan sát kết quả trực tiếp từ giao diện người dùng đồ họa. RedisInsight hiện có thể trực quan hóa kết quả truy vấn RedisGraph.

RedisGraph 2.8 đã ra mắt!

Ngoài ra, RedisInsight còn chứa các hướng dẫn và hướng dẫn nhanh để học RedisGraph một cách tương tác.

Tìm hiểu thêm về RedisGraph trên redis.io và developer.redis.com.