标头字典三元组 (HDT) 是 RDF 数据的一种压缩格式,也可以查询三元组模式。
为了编译该库,您需要安装以下依赖项:
GNU Autoconf
sudo apt install autoconf
sudo dnf install autoconf
brew install autoconf
GNU 库工具
sudo apt install libtool
sudo dnf install libtool
brew install libtool
GNU zip (gzip) 允许提取 GNU 压缩的 RDF 输入文件,并允许加载 GNU 压缩的 HDT 文件。
sudo apt install zlib1g zlib1g-dev
sudo dnf install gzip
pkg-config 用于编译应用程序和库的辅助工具。
sudo apt install pkg-config
sudo dnf install pkgconf-pkg-config
brew install pkg-config
Serd v0.28+ 用于处理 RDF 输入文件的默认解析器。它支持 N-Quads、N-Triples、TriG 和 Turtle 序列化格式。
sudo apt install libserd-0-0 libserd-dev
sudo dnf install serd serd-devel
brew install serd
有时,包管理器分发的 Serd 版本太旧。在这种情况下,也可以手动构建 Serd:请参阅 https://github.com/drobilla/serd 了解安装说明。
要编译并安装,请在hdt-cpp
目录下运行以下命令。这还将编译并安装一些方便的工具。
./autogen.sh
./configure
make -j2
sudo make install
有时,上述说明不会导致 HDT 安装正常运行。本节列举了常见问题及其解决方法。
对京都内阁的支持从未结束,目前已暂停。暂时无法使用KyotoCabinet 编译HDT。
常见错误:
In file included from src/dictionary/KyotoDictionary.cpp:38:0:
src/dictionary/KyotoDictionary.hpp:108:18: error: conflicting return type specified for 'virtual unsigned int hdt::KyotoDictionary::getMapping()'
unsigned int getMapping();
^
当得到
Package requirements (serd-0 >= 0.28.0) were not met: Requested 'serd-0 >= 0.28.0' but version of Serd is 0.X
Serd 不是 0.28+,可能是因为包管理器的原因。在 https://github.com/drobilla/serd 手动构建它。
./configure
找不到Serd运行./configure
时,您会收到类似以下内容的消息:
Package 'serd-0', required by 'virtual:world', not found
这意味着./configure
无法在您的计算机上找到serd-0.pc
文件的位置。您必须自己找到这个位置,例如,通过以下方式:
find /usr/ -name serd-0.pc
一旦找到包含serd-0.pc
文件的目录,您必须通过设置以下环境变量来通知./configure
脚本此位置(其中目录/usr/local/lib/pkgconfig/
适合您的情况):
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig/
编译并安装后,您可以使用位于hdt-cpp/libhdt/tools
中的便捷工具。我们展示了可以使用这些工具执行的一些常见任务。
只能为符合标准的 RDF 输入文件创建 HDT 文件。如果您的输入文件不是符合标准的 RDF,则无法从中创建 HDT 文件。
$ ./rdf2hdt data.nt data.hdt
您可以采用受支持的序列化格式之一(当前:N-Quads、N-Triples、TriG 和 Turtle)将 HDT 文件导出为 RDF 文件。导出的默认序列化格式是 N-Triples。
$ ./hdt2rdf data.hdt data.nt
您可以通过指定主语、谓语和/或宾语术语在终端中发出三重模式 (TP) 查询。问号 ( ?
) 表示未实例化的术语。例如,您可以通过查询 TP ? ? ?
来检索所有三元组。 ? ? ?
:
$ ./hdtSearch data.hdt
>> ? ? ?
http://example.org/uri3 http://example.org/predicate3 http://example.org/uri4
http://example.org/uri3 http://example.org/predicate3 http://example.org/uri5
http://example.org/uri4 http://example.org/predicate4 http://example.org/uri5
http://example.org/uri1 http://example.org/predicate1 "literal1"
http://example.org/uri1 http://example.org/predicate1 "literalA"
http://example.org/uri1 http://example.org/predicate1 "literalB"
http://example.org/uri1 http://example.org/predicate1 "literalC"
http://example.org/uri1 http://example.org/predicate2 http://example.org/uri3
http://example.org/uri1 http://example.org/predicate2 http://example.org/uriA3
http://example.org/uri2 http://example.org/predicate1 "literal1"
9 results shown.
>> http://example.org/uri3 ? ?
http://example.org/uri3 http://example.org/predicate3 http://example.org/uri4
http://example.org/uri3 http://example.org/predicate3 http://example.org/uri5
2 results shown.
>> exit
HDT 的标头组件包含描述 HDT 中包含的数据的元数据,以及有关 HDT 本身的创建元数据。标头的内容可以导出到 N-Triples 文件:
$ ./hdtInfo data.hdt > header.nt
更新 HDT 的标头信息可能很有用。这可以通过从现有 HDT 文件 ( old.hdt
) 和包含新标头信息的 N-Triples 文件 ( new-header.nt
) 生成新 HDT 文件 ( new.hdt
) 来完成:
$ ./replaceHeader old.hdt new.hdt new-header.nt
或者,可以通过 docker 使用这些工具。
构建 docker 镜像(使用任意名称hdt
):
docker build -t hdt .
假设您已经构建了名为hdt
的 docker 镜像:
docker run -it --rm -v $PWD :/workdir hdt bash
root@abcd1234:/workdir#
这将以交互方式启动 docker 映像。列出正在运行的容器中的文件应显示当前目录中的文件。
要运行 hdt 工具集中的任何命令:
root@abcd1234:/workdir# rdf2hdt -f turtle input.ttl output.hdt
要退出正在运行的容器,请使用exit
命令。
HDT 命令也可以直接从(docker)主机系统调用:
docker run --rm -v $PWD :/workdir hdt rdf2hdt -f turtle input.ttl output.hdt
这将从当前目录获取input.ttl
并创建新的output.hdt
。
欢迎贡献!请将您的贡献和拉取请求(PR)基于develop
分支,而不是master
分支。
hdt-cpp
是获得 GNU 宽通用公共许可证 (LGPL) 许可的自由软件。请参阅libhdt/COPYRIGHT
。