6 个版本
0.3.0 | 2023年3月9日 |
---|---|
0.2.3 | 2022年12月27日 |
0.2.2 | 2022年8月16日 |
0.2.1 | 2022年6月17日 |
0.1.0 | 2022年1月5日 |
#1868 in 数据库接口
被 2 个 crate 使用(通过 indradb-proto)
220KB
4.5K SLoC
IndraDB
用 Rust 编写的图数据库。
IndraDB 由服务器和底层库组成。大多数用户会使用服务器,它通过发布作为预编译的二进制文件提供。但如果你是想要直接在应用程序中嵌入图数据库的 Rust 开发者,你可以使用 库。
IndraDB 的原始设计受到 Facebook 的图数据存储 TAO 的强烈启发。特别是,IndraDB 强调实现和查询语法的简洁性,并同样假设它可能代表一个足够大的图,以至于无法进行完整的图处理。随着时间的推移,IndraDB 添加了更丰富的查询语义和其他功能,因此它不能再被称为类似 TAO,尽管我们试图保持一些原始目标。
有关更多详细信息,请参阅 主页。另请参阅 IndraDB 的完整演示,用于浏览维基百科文章链接图。
功能
- 有向和类型化图。
- 基于 JSON 的与顶点和边相关的属性。
- 多跳查询和对索引属性的查询。
- 通过 gRPC 或直接作为库嵌入实现跨语言支持。
- 可插拔的底层数据存储,具有几个内置数据存储。可单独提供 Postgresql 和 sled。
- 用 Rust 编写!高性能,无 GC 停顿,安全性更高。
使用方法
IndraDB 提供了多种与之交互的方式:作为支持跨语言的服务器、作为 Rust 库以及通过 CLI。以下是一些每个用例的示例。
服务器
服务器使用 gRPC 实现跨语言支持。gRPC 支持多种语言;请参阅 官方列表,尽管许多更多语言也得到非官方支持。我们为 Python 和 Rust 提供了官方绑定。以下示例将需要您有一个正在运行的服务器,例如,要启动内存中的服务器,只需运行 indradb-server
。
Python
Python绑定可在此处获得 这里,并以 indradb
的形式发布到pypi。一个示例
import indradb
import uuid
# Connect to the server and make sure it's up
client = indradb.Client("localhost:27615")
client.ping()
# Create a couple of vertices
out_v = indradb.Vertex(uuid.uuid4(), "person")
in_v = indradb.Vertex(uuid.uuid4(), "movie")
client.create_vertex(out_v)
client.create_vertex(in_v)
# Add an edge between the vertices
edge = indradb.Edge(out_v.id, "bar", in_v.id)
client.create_edge(edge)
# Query for the edge
results = list(client.get(indradb.SpecificEdgeQuery(edge))
print(results)
有关进一步参考,请参阅文档和python绑定测试。
Rust
gRPC绑定库可用作 indradb-proto
。一个示例
use indradb;
use indradb_proto as proto;
// Connect to the server and make sure it's up
let mut client = proto::Client::new("grpc://127.0.0.1:27615".try_into()?).await?;
client.ping().await?;
// Create a couple of vertices
let out_v = indradb::Vertex::new(indradb::Identifier::new("person")?);
let in_v = indradb::Vertex::new(indradb::Identifier::new("movie")?);
client.create_vertex(&out_v).await?;
client.create_vertex(&in_v).await?;
// Add an edge between the vertices
let edge = indradb::Edge::new(out_v.id, indradb::Identifier::new("likes")?, in_v.id);
client.create_edge(&edge).await?;
// Query for the edge
let output: Vec<indradb::QueryOutputValue> = client.get(indradb::SpecificEdgeQuery::single(edge.clone())).await?;
// Convenience function to extract out the edges from the query results
let e = indradb::util::extract_edges(output).unwrap();
assert_eq!(e.len(), 1);
assert_eq!(edge, e[0]);
Rust gRPC绑定库被构建为与Rust库紧密对应。但如果您使用100% Rust,并且不需要服务器,则可以跳过所有gRPC的繁琐过程,直接使用Rust库。有关进一步参考,请参阅文档和维基百科索引示例,它严重依赖于indradb-proto
。
其他语言
如果您想做出贡献,为您的最爱语言添加绑定是一个很好的开始!gRPC/protobuf定义在这里。
Rust库
将IndraDB添加到您的 Cargo.toml
indradb-lib = { version = "*", features = ["rocksdb-datastore"] }
(您可能想要锁定版本,或者不包含RocksDB数据存储,仅支持内存。)
这里有一个简短的示例
use indradb;
// Create an in-memory datastore
let db: indradb::Database<indradb::MemoryDatastore> = indradb::MemoryDatastore::new_db();
// Create a couple of vertices
let out_v = indradb::Vertex::new(indradb::Identifier::new("person")?);
let in_v = indradb::Vertex::new(indradb::Identifier::new("movie")?);
db.create_vertex(&out_v)?;
db.create_vertex(&in_v)?;
// Add an edge between the vertices
let edge = indradb::Edge::new(out_v.id, indradb::Identifier::new("likes")?, in_v.id);
db.create_edge(&edge)?;
// Query for the edge
let output: Vec<indradb::QueryOutputValue> = db.get(indradb::SpecificEdgeQuery::single(edge.clone()))?;
// Convenience function to extract out the edges from the query results
let e = indradb::util::extract_edges(output).unwrap();
assert_eq!(e.len(), 1);
assert_eq!(edge, e[0]);
CLI
CLI与运行中的服务器交互。
首先启动服务器: indradb-server
。
然后,例如,计算顶点的数量: indradb-client grpc://127.0.0.1:27615 count vertex
。
安装
版本
我们为Linux和macOS提供预编译的版本。
- 下载您平台上的最新版本。
- 将二进制文件添加到您的
PATH
。 - 启动服务器:
indradb-server
这将启动默认的数据存储。
从源代码
要源代码构建和安装
- 安装rust。IndraDB应该可以与任何rust变体(稳定版、夜间版、beta版)一起使用。
- 确保您已安装gcc 5+和protobuf工具链。
- 克隆存储库:
git clone [email protected]:indradb/indradb.git
。 - 构建/安装它:
cargo install
。
Docker
如果您想在Docker中运行IndraDB,请遵循以下说明。
服务器
构建服务器映像
DOCKER_BUILDKIT=1 docker build --target server -t indradb-server .
运行服务器
docker run --network host --rm indradb-server -a 0.0.0.0:27615
客户端
构建客户端映像
DOCKER_BUILDKIT=1 docker build --target client -t indradb-client .
运行客户端
docker run --network host --rm indradb-client grpc://127.0.0.1:27615 ping
数据存储
IndraDB提供几种不同的数据存储,它们在持久性、事务能力和性能方面有所权衡。
内存
默认情况下,IndraDB启动一个数据存储,将所有值存储在内存中。这是最快的实现,但无法支持大于内存可容纳的图,并且数据仅在显式请求时写入磁盘。
如果您想使用不带持久性支持的常规数据存储,不要传递子命令;例如
indradb-server [options]
如果您想使用常规数据存储但持久到磁盘
indradb-server memory --persist-path=[/path/to/memory/image]
您需要在保存图时显式调用 Sync()
。
RocksDB
如果您想使用rocksdb支持的数据存储,请使用 rocksdb
子命令;例如
indradb-server rocksdb [/path/to/rocksdb.rdb] [options]
Postgres,Sled等。
可以在单独的crate中开发其他数据存储实现,因为IndraDB公开了实现所需的特性
- Postgres可通过indradb-postgres获得。
- sled 可以通过 indradb-sled 获取。
插件
IndraDB 服务器支持插件来扩展客户端可用的功能。插件通过动态链接库加载。
请参阅 hello world 插件 和 naive vertex 插件,以了解如何编写插件。
要包含插件,请查看 --plugins
参数,例如 indradb-server --plugins=plugins/*.so
。它们可以通过 gRPC 的 ExecutePlugin
函数调用。
测试
首先遵循上面的 源代码构建说明。
单元测试
使用 make test
来运行测试套件。请注意,这将运行整个工作区中的完整测试套件,包括所有数据存储实现。您可以通过 TEST_NAME
环境变量筛选要运行的测试。例如,TEST_NAME=create_vertex make test
将运行所有数据存储实现中名称包含 create_vertex
的测试。所有单元测试都将运行在 CI 中。
基准测试
可以通过 make bench
运行微基准测试。
模糊测试
有一个模糊测试器,确保 RocksDB 和内存数据存储操作相同。通过 make fuzz
运行它。
检查
可以通过 make check
运行代码风格和格式化检查。CI 将运行等效的检查。
lib.rs
:
IndraDB 插件的基础设施。
依赖
~5–15MB
~190K SLoC