28个版本 (16个稳定版)

4.0.0 2023年3月9日
3.0.4 2022年12月27日
3.0.3 2022年8月16日
3.0.2 2022年6月17日
0.12.1 2018年3月1日

#31 in 数据库实现

Download history 15/week @ 2024-03-14 78/week @ 2024-03-28 22/week @ 2024-04-04

每月 89 次下载

MPL-2.0 许可证

295KB
6K SLoC

IndraDB

Test crates.io Released API docs

使用Rust编写的图数据库。

IndraDB由服务器和底层库组成。大多数用户会使用服务器,它作为预编译的二进制文件通过发布版提供。但如果您是一位希望直接将图数据库嵌入应用程序中的Rust开发者,您可以使用

IndraDB的原始设计深受TAO,Facebook的图数据存储的启发。特别是,IndraDB强调实现和查询语义的简单性,并同样假设它可能表示足够大的图,以至于无法进行完整的图处理。随着时间的推移,IndraDB添加了更丰富的查询语义和其他功能,因此它不能再被称为类似TAO,尽管我们试图保持一些原始目标。

更多详细信息,请参阅主页。还可以查看IndraDB的完整演示,用于浏览维基百科文章链接图。

功能

  • 有向和类型化的图。
  • 与顶点和边关联的基于JSON的属性。
  • 多跳查询和对索引属性的查询。
  • 通过gRPC跨语言支持,或作为库直接嵌入。
  • 可插拔的底层数据存储,具有多个内置数据存储。提供Postgresqlsled
  • 使用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::default();

// 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 提供预编译的发布版本。

这将启动默认的数据存储。

从源代码

要从中构建和安装源代码

  • 安装 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公开了实现所需的特质。

插件

IndraDB服务器包括对插件的支持,以扩展客户端可用的功能。插件通过动态链接库加载。

请参阅hello world插件naive vertex插件以了解如何编写插件。

要包含插件,请查看--plugins参数的indradb-server,例如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运行lint和格式化检查。CI中将会运行等效的检查。

依赖项

~35–48MB
~843K SLoC