由 RocksDB 持久键值存储提供支持的图形 API,用于快速存储
项目描述
Basalt - C++ 和 Python 的图形存储 API
Basalt 是一个图形存储 API,由 RocksDB 持久键值存储提供支持,用于 NVMe 技术等快速存储。
文档目前托管在 GitHub 上:[https://bluebrain.github.io/basalt]
发展阶段
Basalt 的 C++ 和 Python API 已经稳定,但未来可能会有大量的添加。因此,这个库的开发状态仍然是 beta。
用法
Python
图拓扑 API
class PLInfluences(basalt.GraphTopology):
"""A directed graph where vertices are programming languages.
"""
directed(True)
class Vertex(Enum):
LANGUAGE = 1
# Declare a vertex type
vertex("language", Vertex.LANGUAGE)
# Declare a directed edge between 2 programming languages
# to represent how they relate.
edge(Vertex.LANGUAGE, Vertex.LANGUAGE, name="influenced", plural="influenced")
@classmethod
def load_from_dbpedia(cls):
# [...]
g = PLInfluences.load_from_dbpedia("/path/on/disk")
# Iterate over all vertices of type "languages"
for language in g.languages:
print(language.id, language.data())
# Iterate over all vertices connected to vertex `language`
# through the `influenced` edge type.
for influenced in language.influenced:
print(" ", influenced.data())
低级 Python 绑定
# Load or initialize a graph on disk
g = basalt.UndirectedGraph("/path/on/disk")
# Add one vertex of type 0 and identifier 1
g.vertices.add((0, 1))
# Insert 10 vertices at once
# (10, 0), (10, 1), ... (10, 10)
g.vertices.add(numpy.full((10,), 1, dtype=numpy.int32), # types
numpy.arange(10, dtype=numpy.int64)) # ids
# Connect 2 vertices
g.edges.add((0, 1), (1, 0))
# Connect vertex (0, 1) to several vertices at once
# (0,1)->(1,0), (0,1)->(1,1), ... (0,1)->(1,9)
g.edges.add((0, 1),
numpy.full((9,), 1, dtype=numpy.int32),
numpy.arange(9, dtype=numpy.int64)
# Commit changes on disk
g.commit()
C++ API
// Load or initialize a graph on disk
basalt::UndirectedGraph g("/path/on/disk");
// Add one vertex of type 0 and identifier 1
g.vertices().insert({0, 1});
// Add one vertex of type 0 and identifier 2
g.vertices().insert({0, 2});
// Iterate over vertices
for (const auto& vertex: g.vertices()) {
std::clog << vertex << '\n';
}
// Connect both vertices
g.edges().insert({0, 1}, {0, 2}));
for (const auto& edge: g.edges()) {
std::clog << edge.first << " -> " << edge.second << '\n';
}
// Commit changes on disk
g.commit();
安装
C++ API
柯南包
这个存储库提供了一个Conan包,可以轻松集成到您现有的项目中。
制作
也可以使用 CMake 构建和安装库,请参阅下面的构建部分。
Python API
皮皮
玄武岩的 Python 绑定在Pypi上可用。
蓝脑 5 超级计算机
Basalt 目前作为 Blue Brain 5 超级计算机上的模块发布:
$ module purge
$ . /gpfs/bbp.cscs.ch/apps/hpc/jenkins/config/modules.sh
$ module load py-basalt
$ python3
Python 3.6.3 (default, Oct 3 2017, 07:47:49)
[GCC 6.4.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import basalt
>>> basalt.__version__
'0.2.2'
>>> basalt.__rocksdb_version__
'5.17.2'
手动构建和安装说明
要求
获取代码
这个存储库抓取了一些第三方库作为git 模块。要在克隆玄武岩时克隆它们,请使用git clone --recursive
option。
如果您已经克隆了玄武岩,您可以使用以下命令获取 git 子模块:
git submodule update --recursive --init
建立图书馆 101
仅限 C++ 库
要构建 basalt C++ 共享库并运行测试:
cd /path/to/basalt
mkdir build
pushd build
cmake ..
CTEST_OUTPUT_ON_FAILURE=1 make all test
要安装库:
pushd build
cmake -DCMAKE_INSTALL_PREFIX=/usr/local .
make all install
Python 3 绑定
要构建和运行测试:
cd /path/to/basalt
python3 setup.py test
要安装软件包:
- 用点子:
pip3 install -U .
- 与distutils:
python3 setup.py install
- 创建二进制压缩包:
- 最简单的:
python3 setup.py bdist
- 轮子:
pip3 install wheel; python3 setup.py bdist_wheel
- 可重定位档案:
python3 setup.py bdist_dumb --relative
- 最简单的:
CMake 变量和目标
主要 CMake 变量:
Basalt_FORMATTING:BOOL
:提供构建目标clang-format
以检查 C++ 代码格式Basalt_STATIC_ANALYSIS:BOOL
:提供构建目标clang-tidy
以执行 C++ 代码的静态分析Basalt_ARCH
: 赋予-m
编译器选项的值。例如“原生”Basalt_PRECOMMIT:BOOL
: 在 git 提交之前启用自动检查Basalt_CXX_OPTIMIZE:BOOL
: 用优化编译 C++Basalt_CXX_SYMBOLS:BOOL
: 用调试符号编译 C++Basalt_CXX_WARNINGS:BOOL=ON
: 编译带有警告的 C++
如需更详细的列表,请参阅CMakeCache.txt
CMake 构建目录中的文件。
CMake 目标:
basalt
: 构建纯 C++ 库(没有 Python 绑定)_basalt
: 使用 Python 绑定构建 C++ 库unit-tests
: 构建一个 C++ 可执行文件来测试 C++ 纯库all
: 构建上面的 3 个目标test
: 执行测试。ctest --output-on-failure -VV
建议改为执行命令install
:安装纯 C++ 库和在另一个 CMake 项目中轻松使用 basalt 所需的 CMake 配置
Python 设置工具命令
以下是可用的主要 Python setuptools 命令。
build
: 构建原生库test
:构建和测试包。它还执行 C++ 单元测试以及 Sphinx 文档中的代码片段。install
: 安装 Python 包doctest
: 执行 Sphinx 文档中的代码片段build_sphinx
: 构建 Sphinx 文档
例如:python3 setup.py build_sphinx
文件布局
├── basalt ................... python code of the package
├── cmake
│ └── hpc-coding-conventions git module for C++ code guidelines
├── dev ...................... development related scripts
├── doc ...................... sphinx documentation source code
├── include
│ └── basalt ............... public headers of the C++ library
├── README.md ................ that's me!
├── src
│ ├── basalt ............... C++ library implementation
│ └── third_party .......... C++ libraries (mostly as git modules)
└── tests
├── benchmarks ........... scripts to execute before creating a git tag
├── py ................... python unit-tests
└── unit ................. C++ unit-tests using Catch2
嵌入式第三方
外部库通过复制/粘贴或src/third_party
目录中的 git 子模块包括在内。
- Catch2:现代的、C++ 原生的、仅标头的、用于单元测试、TDD 和 BDD 单元测试库的测试框架。
- fmt:一个现代格式库 (还不是 CMake 构建的一部分)
- pybind11 : C++11 和 Python 之间的无缝可操作性
- SpdLog:快速 C++ 日志库。
贡献
如果您想改进项目或发现任何问题,欢迎您的每一个贡献。请查看贡献指南以获取更多信息。