Backend·Hacker News·1 lượt xem

Grafeo – Cơ sở dữ liệu đồ thị nhanh, gọn, có thể nhúng được xây dựng trong Rust

Grafeo – A fast, lean, embeddable graph database built in Rust

AI Summary

Grafeo là một graph database mới, hiệu năng cao, có thể nhúng (embeddable) được viết bằng Rust. Theo các benchmark như LDBC Social Network, Grafeo cho hiệu suất vượt trội so với các giải pháp hiện tại. Grafeo hỗ trợ cả Labeled Property Graphs và RDF, đa dạng các ngôn ngữ truy vấn như GQL, Cypher, Gremlin, và cả vector search. Nhờ vậy, nó là một lựa chọn linh hoạt cho nhiều ứng dụng cần xử lý dữ liệu dạng đồ thị. Các developer có thể sử dụng Grafeo dưới dạng một thư viện nhúng (embedded library) với các bindings cho nhiều ngôn ngữ lập trình khác nhau, hoặc triển khai như một server độc lập. Nhân Rust của Grafeo đảm bảo an toàn bộ nhớ (memory safety) và hỗ trợ concurrency hiệu quả.

Cơ sở dữ liệu đồ thị có thể nhúng, hiệu suất cao với lõi Rust và không cần phụ thuộc C. Các liên kết Python, Node.js, Go, C, C#, Dart và WebAssembly. Ngôn ngữ truy vấn GQL (tiêu chuẩn ISO).

Grafeo Playground


Tại sao lại là Grafeo?

  • Hiệu suất cao


    Cơ sở dữ liệu đồ thị nhanh nhất được thử nghiệm trên Điểm chuẩn Mạng xã hội LDBC, cả được nhúng và dưới dạng máy chủ, với mức chiếm dụng bộ nhớ thấp hơn so với các cơ sở dữ liệu trong bộ nhớ khác. Được xây dựng trong Rust với khả năng thực thi theo vectơ, phân đoạn thích ứng và các hoạt động được tối ưu hóa cho SIMD.

  • Truy vấn đa ngôn ngữ


    GQL, Cypher, Gremlin, GraphQL, SPARQL và SQL/PGQ. Chọn ngôn ngữ truy vấn phù hợp với dự án và trình độ chuyên môn.

  • Hỗ trợ LPG & RDF


    Hỗ trợ mô hình dữ liệu kép cho cả Đồ thị thuộc tính được gắn nhãn và bộ ba RDF. Chọn mô hình phù hợp với miền.

  • Tìm kiếm vectơ


    Tìm kiếm tương tự dựa trên HNSW với lượng tử hóa (Scalar, Binary, Product). Kết hợp truyền tải biểu đồ với sự tương đồng về ngữ nghĩa.

  • Được nhúng hoặc độc lập


    Nhúng trực tiếp vào các ứng dụng không có phụ thuộc bên ngoài hoặc chạy như một máy chủ độc lập với API REST và giao diện người dùng web. Từ các thiết bị biên đến cụm sản xuất.

  • Rust Core


    Công cụ cơ sở dữ liệu lõi được viết bằng Rust mà không cần phụ thuộc C. Bộ cấp phát tùy chọn (jemalloc/mimalloc) và TLS sử dụng thư viện C để thực hiện. An toàn bộ nhớ nhờ thiết kế có khả năng xử lý đồng thời dễ dàng.

  • Giao dịch ACID


    Tuân thủ ACID hoàn toàn với cách ly ảnh chụp nhanh dựa trên MVCC. Giao dịch đáng tin cậy cho khối lượng công việc sản xuất.

  • Ràng buộc đa ngôn ngữ


    Python (PyO3), Node.js/TypeScript (napi-rs), Go (CGO), C (FFI), C# (.NET 8 P/Invoke), Dart (dart:ffi) và WebAssembly (wasm-bindgen). Sử dụng Grafeo từ ngôn ngữ bạn chọn.

  • Hệ sinh thái


    Tích hợp AI (LangChain, LlamaIndex, MCP), tiện ích sổ tay tương tác, biểu đồ dựa trên trình duyệt thông qua WebAssembly, máy chủ độc lập với giao diện người dùng web và các công cụ đo điểm chuẩn.


Bắt đầu nhanh

uv add grafeo
nhập grafeo
 
# Tạo cơ sở dữ liệu trong bộ nhớ
db = grafeo.GrafeoDB()
 
# Tạo nút và cạnh
db.thực thi("""
 INSERT (:Người {tên: 'Alix', tuổi: 30})
  INSERT (:Person {name: 'Gus', tuổi: 25})
"")

db.thực thi ("""
 MATCH (a:Person {name: 'Alix'}), (b:Person {name: 'Gus'})
 CHÈN (a)-[:KNOWS {since: 2024>]->(b)
""" )

# Truy vấn biểu đồ
kết quả = db.thực thi("""
  MATCH (p:Person)-[:KNOWS]->(friend)
 TRẢ LẠI p.name,friend.name
""")

 cho hàng trong kết quả:
 print(f"{row['p.name'] biết {hàng ['friend.name']")
cargo thêm grafeo
sử dụng  grafeo::GrafeoDB;

fn main() -> Kết quả<(), grafeo_common:: utils::lỗi::Lỗi> {
 // Tạo cơ sở dữ liệu trong bộ nhớ
 let db =  GrafeoDB::new_in_memory();

 // Tạo phiên và thực hiện truy vấn
 hãy  mut phiên = db.phiên();

 phiên.thực thi(r#"
  INSERT (:Person {name: 'Alix', tuổi: 30})
 INSERT (:Person {name: 'Gus', tuổi: 25})
 "#)?;
 
 phiên.thực thi(r#"
 MATCH (a:Person {name: 'Alix'}), (b:Person {name: 'Gus'})
  CHÈN (a)-[:KNOWS {since: 2024}]->(b)
 "#)?;

 // Truy vấn biểu đồ
 cho kết quả = phiên.thực thi(r#"
 MATCH (p:Person)-[:KNOWS]->(friend)
 TRẢ LẠI p.name,friend.name
 "#)?;

  cho hàng trong kết quả.hàng {
 println!("{:?}",  hàng);
 

 Được(())
 

Tính năng

Hỗ trợ mô hình dữ liệu kép

Grafeo hỗ trợ cả hai mô hình dữ liệu biểu đồ chính với bộ nhớ được tối ưu hóa cho từng mô hình:

  • Nút có nhãn và thuộc tính
  • Cạnh với các loại và thuộc tính
  • Thuộc tính hỗ trợ các loại dữ liệu phong phú
  • Lý tưởng cho mạng xã hội, biểu đồ tri thức, dữ liệu ứng dụng
  • Bộ ba : câu lệnh chủ ngữ-vị ngữ-đối tượng
  • Chỉ mục SPO/POS/OSP để truy vấn hiệu quả
  • Tuân thủ tiêu chuẩn W3C
  • Lý tưởng cho web ngữ nghĩa, dữ liệu được liên kết, bản thể luận

Ngôn ngữ truy vấn

Chọn ngôn ngữ truy vấn phù hợp với dự án:

Ngôn ngữ Mô hình dữ liệu Phong cách
GQL (mặc định) LPG Tiêu chuẩn ISO, khớp mẫu khai báo
Cypher LPG Mẫu nghệ thuật ASCII, tương thích Neo4j
Gremlin LPG Apache TinkerPop, dựa trên truyền tải
GraphQL LPG, RDF Dựa trên lược đồ, quen thuộc với các nhà phát triển web
SPARQL RDF Tiêu chuẩn W3C cho truy vấn RDF
SQL/PGQ LPG SQL:2023 GRAPH_TABLE for Truy vấn đồ thị gốc SQL

 MATCH (tôi:Người {tên: 'Alix')-[:BIẾT]->(bạn)-[: BIẾT]->(fof)
ĐÂU fof <> tôi
TRẢ LẠI DISTINCT fof .tên
MATCH (tôi:Người {tên: 'Alix'})-[:BIẾT]->( bạn)-[:BIẾT]->(fof)
ĐÂU fof <> tôi
TRẢ LẠI  DISTINCT fof.tên
g.V().has('name', 'Alix').out('KNOWS').out('KNOWS').
 ở đâu(neq('me')).values('name').dedup()
 {
 Người(tên: "Alix") {
 bạn bè  { bạn bè { tên  
 

 SELECT DISTINCT ?fofName ĐÂU {
 ?me foaf:tên "Alix" .
 ?me foaf:biết ?bạn .
 ?friend foaf:biết ?fof .
 ?fof foaf:tên ?fofName  .
 LỌC(?fof != ?me)

Điểm nổi bật về kiến trúc

  • Công cụ thực thi dựa trên lực đẩy với tính năng song song theo hướng từng phần
  • Lưu trữ theo cột với tính năng nén theo loại cụ thể
  • Trình tối ưu hóa truy vấn dựa trên chi phí với ước tính số lượng thẻ
  • Giao dịch MVCC với cách ly ảnh chụp nhanh
  • Bản đồ vùng để bỏ qua dữ liệu thông minh

Cài đặt

 uv thêm grafeo
npm cài đặt @grafeo-db/js
go get github.com/GrafeoDB/grafeo/crates/binds/go
 
cargo thêm grafeo
dotnet thêm gói GrafeoDB
 # pubspec.yaml
phụ thuộc:
 grafeo: ^0.5.21
 npm cài đặt @grafeo-db/wasm

Giấy phép

Grafeo được cấp phép theo Apache-2.0 Giấy phép.

Tác giả: 0x1997

#discussion