由于memgraph是一个仅存储数据在内存中的图形数据库,
GQLalchemy库为图形算法中未使用的大型属性提供了盘中存储解决方案。
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
这里发生了什么?
-
graphdb
创建了与内存图数据库的连接 -
SQLitePropertyDatabase
在其构造函数中附加到graphdb
- 创建标签
User
的节点定义时,定义了两个属性 -
User.id
是类型int
所需的属性,它创建独特性并存在约束和内部索引 -
User.huge_string
是一种可选的用户属性,可保存并从SQLite数据库中加载 -
my_secret
是一个巨大的字符串的示例,它会不必要地放慢图形数据库 -
User().save()
用标签User
保存在图数据库中,并将huge_string
存储在SQLitePropertyDatabase
中 - 加载数据时,会发生反向,从图数据库中获取节点和
huge_string
属性从SQLitePropertyDatabase
获取
将大型属性保存在磁盘数据库中
图数据库中使用的许多图具有带有大量元数据的节点,这些节点在图计算中未使用。图形数据库并非旨在使用诸如字符串或镶木素文件之类的大型属性有效地执行。
通常,通过使用单独的SQL数据库或键值存储来解决该问题,以将大型属性与节点的ID连接起来。尽管解决方案很简单,但实施和维护还是很麻烦。更不用说,您必须从头开始为每个项目做到这一点。
我们已经确定了这个问题并决定采取行动。随着GQLalchemy 1.1的发布,您可以轻松地定义哪些属性将保存在图形数据库中,哪些属性将保存在磁盘存储解决方案中。在模型定义中,您可以做一次,并且在正确的数据库中正确保存或正确加载了属性。
它是如何工作的?
gqlalchemy是一个python库,旨在成为首选对象映射器(OGM) - 图数据库对象和Python对象之间的链接。它建立在Pydantic的顶部,并提供对象建模,验证,序列化和反序列化。
使用GQLalchemy,您可以定义Python类,将图形对象映射到图形数据库中的图形对象。
每个这样的类都有包含图形对象的数据的属性或字段。
当您希望将属性保存在磁盘上而不是内存数据库上时,您可以使用on_disk
参数指定。
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)
此指令在节省或从数据库中保存或加载时会影响节点序列化和避免。
在能够使用它之前,您必须指定要使用的OnDiskPropertyDatabase
的实现。
例如,我们将使用SQLite实现。
from gqlalchemy import Memgraph, SQLiteOnDiskPropertyDatabase
db = Memgraph
SQLiteOnDiskPropertyDatabase("property_database.db", db)
现在,每当您从图形数据库中保存或加载图对象时,on_disk
属性将使用SQLiteOnDiskPropertyDatabase
自动处理。
user = User(
graphdb_property="This property goes into the graph database",
on_disk_property="This property goes into the sqlite database"
).save(db)
结论
现在,您知道如何使用磁盘属性,因此您的内存图不会吞噬太多的RAM。
图形算法也应该更快地运行,因为图形分析通常不需要这些大属性。
如果您对如何使用磁盘存储有疑问,请访问我们的Discord server并给我们留言。