Hướng dẫn in-memory graph database python - cơ sở dữ liệu đồ thị trong bộ nhớ python

Vì MemGraph là cơ sở dữ liệu đồ thị chỉ lưu trữ dữ liệu trong bộ nhớ, thư viện GQLalchemy cung cấp giải pháp lưu trữ trên đĩa cho các thuộc tính lớn không được sử dụng trong các thuật toán đồ thị.

from gqlalchemy import Memgraph, SQLitePropertyDatabase, Node, Field
from typing import Optional


graphdb = Memgraph()
SQLitePropertyDatabase('path-to-my-db.db', graphdb)

class User(Node):
    id: int = Field(unique=True, exists=True, index=True, db=graphdb)
    huge_string: Optional[str] = Field(on_disk=True)
  
my_secret = "I LOVE DUCKS" * 1000
john = User(id=5, huge_string=my_secret).save(db)
john2 = User(id=5).load(db)
print(john2.huge_string)  # prints I LOVE DUCKS, a 1000 times

Điều gì xảy ra ở đây?

  • graphdb tạo kết nối với cơ sở dữ liệu đồ thị trong bộ nhớ
  • SQLitePropertyDatabase gắn vào graphdb trong hàm tạo của nó
  • Khi tạo định nghĩa cho một nút có nhãn User, hai thuộc tính được xác định
  • User.id là một thuộc tính cần thiết của loại int tạo ra sự độc đáo và tồn tại các ràng buộc và một chỉ mục bên trong MemGraph
  • from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
    from typing import Optional
    
    
    class User(Node):
        graphdb_property: Optional[str] = Field()
        on_disk_property: Optional[str] = Field(on_disk=True)
    
    0 là một thuộc tính người dùng tùy chọn được lưu và tải từ cơ sở dữ liệu SQLite
  • from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
    from typing import Optional
    
    
    class User(Node):
        graphdb_property: Optional[str] = Field()
        on_disk_property: Optional[str] = Field(on_disk=True)
    
    1 là một ví dụ về một chuỗi lớn sẽ làm chậm một cách không cần thiết cơ sở dữ liệu đồ thị
  • from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
    from typing import Optional
    
    
    class User(Node):
        graphdb_property: Optional[str] = Field()
        on_disk_property: Optional[str] = Field(on_disk=True)
    
    2 lưu nút với nhãn User trong cơ sở dữ liệu đồ thị và lưu trữ
    from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
    from typing import Optional
    
    
    class User(Node):
        graphdb_property: Optional[str] = Field()
        on_disk_property: Optional[str] = Field(on_disk=True)
    
    4 trong SQLitePropertyDatabase
  • Khi tải dữ liệu, xảy ra nghịch đảo, nút được tìm nạp từ cơ sở dữ liệu đồ thị và thuộc tính
    from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
    from typing import Optional
    
    
    class User(Node):
        graphdb_property: Optional[str] = Field()
        on_disk_property: Optional[str] = Field(on_disk=True)
    
    4 từ SQLitePropertyDatabase

Lưu các thuộc tính lớn trong cơ sở dữ liệu trên đĩa

Nhiều biểu đồ được sử dụng trong cơ sở dữ liệu đồ thị có các nút có nhiều siêu dữ liệu được sử dụng trong các tính toán đồ thị. Cơ sở dữ liệu đồ thị được thiết kế để thực hiện hiệu quả với các thuộc tính lớn như chuỗi hoặc tệp sàn. Vấn đề thường được giải quyết bằng cách sử dụng cơ sở dữ liệu SQL riêng biệt hoặc lưu trữ giá trị khóa để kết nối các thuộc tính lớn với ID của nút. Mặc dù giải pháp rất đơn giản, nhưng nó rất cồng kềnh để thực hiện và duy trì. Chưa kể, bạn phải làm điều đó cho mỗi dự án từ đầu. Chúng tôi đã xác định được vấn đề và quyết định hành động. Với việc phát hành GQLalchemy 1.1, bạn có thể dễ dàng xác định các thuộc tính nào sẽ được lưu trong cơ sở dữ liệu đồ thị và trong giải pháp lưu trữ trên đĩa. Bạn có thể làm điều đó một lần, trong định nghĩa mô hình và không bao giờ lo lắng nữa nếu các thuộc tính được lưu hoặc tải đúng cách từ cơ sở dữ liệu chính xác.

Làm thế nào nó hoạt động?

GQLalchemy là một thư viện Python nhằm mục đích trở thành bản đồ đồ thị đối tượng (OGM)-một liên kết giữa các đối tượng cơ sở dữ liệu đồ thị và các đối tượng Python. Nó được xây dựng trên đỉnh của Pydantic và cung cấp mô hình hóa, xác thực, tuần tự hóa và giải phóng hóa ra khỏi hộp. Với GQLalchemy, bạn có thể xác định các lớp Python ánh xạ tới các đối tượng đồ thị như các nút và mối quan hệ trong cơ sở dữ liệu đồ thị. Mỗi lớp như vậy có các thuộc tính hoặc trường chứa dữ liệu về các đối tượng đồ thị. Khi bạn muốn một thuộc tính được lưu trên đĩa thay vì cơ sở dữ liệu trong bộ nhớ, bạn chỉ định rằng với đối số

from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
from typing import Optional


class User(Node):
    graphdb_property: Optional[str] = Field()
    on_disk_property: Optional[str] = Field(on_disk=True)
8.

from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
from typing import Optional


class User(Node):
    graphdb_property: Optional[str] = Field()
    on_disk_property: Optional[str] = Field(on_disk=True)

Hướng dẫn này ảnh hưởng đến việc tuần tự hóa nút và giải phóng hóa khi nó được lưu hoặc tải từ cơ sở dữ liệu. Trước khi có thể sử dụng nó, bạn phải chỉ định việc triển khai

from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
from typing import Optional


class User(Node):
    graphdb_property: Optional[str] = Field()
    on_disk_property: Optional[str] = Field(on_disk=True)
9 mà bạn muốn sử dụng. Ví dụ, chúng tôi sẽ sử dụng triển khai SQLite.

from gqlalchemy import Memgraph, SQLiteOnDiskPropertyDatabase


db = Memgraph
SQLiteOnDiskPropertyDatabase("property_database.db", db)

Bây giờ, mỗi khi bạn lưu hoặc tải một đối tượng biểu đồ từ cơ sở dữ liệu biểu đồ, các thuộc tính

from gqlalchemy import Node, Field, SQLiteOnDiskPropertyDatabase
from typing import Optional


class User(Node):
    graphdb_property: Optional[str] = Field()
    on_disk_property: Optional[str] = Field(on_disk=True)
8 sẽ được xử lý tự động bằng cách sử dụng
from gqlalchemy import Memgraph, SQLiteOnDiskPropertyDatabase


db = Memgraph
SQLiteOnDiskPropertyDatabase("property_database.db", db)
1.

user = User(
    graphdb_property="This property goes into the graph database",
    on_disk_property="This property goes into the sqlite database"
).save(db)

Sự kết luận

Bây giờ bạn đã biết cách sử dụng các thuộc tính trên đĩa, vì vậy biểu đồ trong bộ nhớ của bạn không ăn quá nhiều RAM. Các thuật toán đồ thị cũng nên chạy nhanh hơn vì hầu hết các thuộc tính lớn này thường không cần thiết cho phân tích đồ thị. Nếu bạn có câu hỏi về cách sử dụng lưu trữ trên đĩa, hãy truy cập máy chủ Discord của chúng tôi và gửi cho chúng tôi một tin nhắn.