標頭字典三元組 (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
。