关于 dannet
DanNet 是丹麦语的 WordNet,以 RDF 作为数据库、应用层和主要序列化格式的原生表示。它面向需要丹麦语词汇语义关系的研究人员和开发者,支持通过 SPARQL 查询。项目同时提供可通过 MCP 连接 AI 工具的服务。
主要功能
- 01丹麦语词汇语义关系数据
- 02基于 Ontolex-lemon 与 GWA 关系的 RDF 表示
- 03提供 RDF、CSV、WN-LMF 和 DMLex 多种格式
- 04通过 Apache Jena 支持 SPARQL 查询
- 05附带 COR、DDS 等配套数据集
适用场景
- 01为丹麦语自然语言处理提供词义关系数据
- 02通过 Claude 等 AI 工具查询丹麦语语义关系
- 03将丹麦语词网数据导入 wn 库进行分析
MCP 相关
该项目提供远程 MCP 服务(https://wordnet.dk/mcp),向 MCP 客户端暴露对 DanNet 语义关系的查询能力。
配置
远程服务无需本地安装。选择你使用的客户端,复制配置或使用一键安装。
https://wordnet.dk/mcpclaude mcp add --transport http kuhumcst-dannet https://wordnet.dk/mcp{"mcpServers":{"kuhumcst-dannet":{"type":"http","url":"https://wordnet.dk/mcp"}}}在 Cursor 中打开{"servers":{"kuhumcst-dannet":{"type":"http","url":"https://wordnet.dk/mcp"}}}在 VS Code 中打开{"mcpServers":{"kuhumcst-dannet":{"type":"http","url":"https://wordnet.dk/mcp"}}}{"mcpServers":{"kuhumcst-dannet":{"serverUrl":"https://wordnet.dk/mcp"}}}命令在终端中运行;JSON 粘贴到对应客户端的 MCP 配置后重启。需要授权的服务会在首次连接时提示登录。
工具
6| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| word | string | 是 |
详细介绍
DanNet 是丹麦语的 WordNet。DanNet 使用 RDF 作为原生表示形式,既用于数据库层和应用空间,也作为主要序列化格式。
- 在 wordnet.dk 浏览数据
- 通过与 AI 集成查询数据
- 从发布页面下载数据集
目录
数据集格式
DanNet 提供多种格式,以最大限度地提高兼容性:
| 格式 | 描述 |
|---|---|
| RDF (Turtle) | 原生表示形式。加载到任意 RDF 图数据库(如 Apache Jena),并使用 SPARQL 查询。 |
| CSV | 附带列元数据,以 CSVW 格式发布。 |
| WN-LMF | XML 格式,兼容 wn 等 Python 库。 |
| DMLex | OASIS DMLex 1.0 表示形式,同时提供 XML 和 JSON,以及丹麦语和英语两个版本。DMLex 浏览器会以词典形式展示内容。 |
示例:在 Python 中使用 DanNet
import wn
wn.add("dannet-wn-lmf.xml.gz")
for synset in wn.synsets('kage'):
print((synset.lexfile() or "?") + ": " + (synset.definition() or "?"))
各格式之间的差异
虽然每种格式都包含所有同义词集、义项和词语,但 CSV、WN-LMF 和 DMLex 版本并未包含所有数据点:
- CSV:将开放图转换为固定表格时,会丢失部分数据。
- WN-LMF:根据标准,仅包含官方 GWA 关系(不包含 DanNet 架构中的专有 DanNet 关系)。
- DMLex:在一个文件中合并 DanNet、COR、DDS 和 COR.SEM。不包含与其他数据集的关系。转换规则请参阅 doc/dmlex/plan.md。
如需完整数据集,请使用 RDF 格式或在 wordnet.dk 浏览。
配套数据集
多个配套数据集会为 RDF 图补充额外数据:
| 数据集 | 描述 |
|---|---|
| COR | 将 DanNet 资源关联到 COR 项目的 ID。 |
| DDS | 为 DanNet 资源添加情感数据。 |
| OEWN extension | 为 Open English WordNet 提供 DanNet 风格的标签,以便浏览两个数据集之间的关联。 |
推断数据
基础数据集、配套数据集和本体元数据中隐含着其他数据,可通过推断获得。这些推断结果可在 wordnet.dk 浏览。包含完整推断图的发布版本会特别标明。
标准
DanNet 基于 Ontolex-lemon 标准,并结合了全球 WordNet 协会定义的关系,这些关系用于官方的 GWA RDF 标准。
| Ontolex-lemon 类 | 表示 |
|---|---|
ontolex:LexicalConcept | 同义词集 |
ontolex:LexicalSense | 词义 |
ontolex:LexicalEntry | 词语 |
ontolex:Form | 形式 |

URI 前缀
| 前缀 | URI | 用途 |
|---|---|---|
dn | https://wordnet.dk/dannet/data/ | 数据集实例 |
dnc | https://wordnet.dk/dannet/concepts/ | 本体类型成员 |
dns | https://wordnet.dk/dannet/schema/ | 模式定义 |
dnf | https://wordnet.dk/dannet/function/ | 自定义 SPARQL 函数(dnf:path、dnf:lch、dnf:wup 同义词集相似度) |
所有 DanNet URI 都指向 HTTP 资源。通过 GET 请求访问其中一个 URI,会返回该资源的数据。
模式
DanNet 以兼容 Ontolex 的方式,在 DanNet 模式中定义了专有关系。此外还有一个用于 EuroWordNet 概念的模式。这两个模式都遵循 Philippe Martin 列出的 RDF 惯例。
大模型集成
DanNet 可通过 MCP(模型上下文协议)连接到 Claude 等 AI 工具。
- MCP 服务 URL:
https://wordnet.dk/mcp - 注册表 ID:
io.github.kuhumcst/dannet
例如,要在 Claude Desktop 中连接:前往 Settings > Connectors > Browse Connectors,点击“add a custom one”,输入名称(例如“DanNet”)和 MCP 服务 URL。

连接后,你可以直接通过 Claude 查询 DanNet 的语义关系。
实现
数据库后端采用 Apache Jena,这是一个成熟的 RDF 三元组存储,支持 OWL 推理。DanNet 的关系在 Jena 中表示时,会构成可查询的知识图谱。DanNet 使用 Clojure 开发,并借助 Aristotle 等库与 Jena 交互。
有关设计决策的更多信息,请参阅 rationale.md。
完整生产环境配置
wordnet.dk 上的生产部署由 Docker Compose 管理,包含三项服务:
- DanNet — Clojure/ClojureScript Web 应用
- MCP server — 基于 Python 的 MCP 服务,为大模型提供访问 DanNet 的能力
- Caddy — 处理 HTTPS 和路由的反向代理
Clojure 支持
可以通过多种方式从 Clojure 查询 DanNet(请参阅 queries.md)。Apache Jena 内置事务支持,并可通过 TDB 2 层实现持久化。
Web 应用
前端使用 ClojureScript 编写,采用 Rum,由 Pedestal 提供服务。该应用既可作为单页应用(使用 JavaScript)运行,也可作为常规 HTML 网站(不使用 JavaScript)运行。内容协商会根据请求提供不同的表示形式(HTML、RDF、Transit+JSON)。
详情请参阅 doc/web.md。
引导流程
新版本基于前一个版本进行引导。流程位于 dk.cst.dannet.db.bootstrap:
- 加载并清理前一版本的 RDF 数据
- 使用当前架构转换为三元组
- 导入 Apache Jena 图,并应用版本变更(仅在发布新版本时执行,即
to与from不同时) - 通过 OWL/RDFS 架构推理出额外的三元组
- 导出最终的 RDF 数据集(参见数据库发布工作流)
引导数据位于相对于执行目录的
./bootstrap下: DanNet 版本资源文件位于./bootstrap/from/<version>/(以引导所基于的版本命名, 因此可以共存多个版本),共享的英语数据集位于./bootstrap/other/english/。 缺失的文件会自动下载,因此只有在离线工作时才需要手动放置文件。
设置
DanNet 需要 Java 和 Clojure 的官方 CLI 工具。依赖项在 deps.edn 中指定。
开发
- 在 dk.cst.dannet.web.service 中使用
(restart)启动 Web 服务 — 可通过localhost:3456访问 - 使用 shadow-cljs 运行前端:
npx shadow-cljs watch app
测试发布构建
使用 Docker(需要 Docker 守护进程正在运行):
# From the docker/ directory
docker compose up --build
或者手动运行:
shadow-cljs --aliases :frontend release app
clojure -T:build org.corfield.build/uber :lib dk.cst/dannet :main dk.cst.dannet.web.service :uber-file "\"dannet.jar\""
java -jar -Xmx4g dannet.jar
内存需求
系统空闲时使用约 1.5 GB 内存,重建数据库时使用约 3 GB。服务器应至少有 4 GB 可用内存。
验证 RDF(SHACL)
dn: 数据集会根据位于 resources/schemas/internal/shapes/ 的 SHACL 形状进行验证(参见 dk.cst.dannet.db.shapes)。验证通过以下几种方式进行:
- 每次启动时都会异步对断言图进行非致命检查,记录违规情况并将数量与已知基线进行比较;
dn:数据集的 RDF 导出设有门槛:基线回归会中止导出;以及- 基于测试装置的测试通过
clojure -X:validate:test运行,GitHub Actions 工作流 .github/workflows/test.yml 也会执行该命令。
验证 WN-LMF
python3 -m venv examples/venv
source examples/venv/bin/activate
python3 -m pip install wn
python -m wn validate --output-file examples/wn-lmf-validation.json export/wn-lmf/dannet-wn-lmf.xml
验证 DMLex
dk.cst.dannet.db.export.dmlex-validate 中的验证器会根据官方 DMLex 架构检查变体的两种序列化形式。它需要 :validate 别名:
clojure -M:validate -e "((requiring-resolve 'dk.cst.dannet.db.export.dmlex-validate/validate-dmlex!) \"export/dmlex/\" \"da\")"
部署
wordnet.dk 上的生产服务器作为 systemd 服务运行,并委托给 Docker。
服务设置
cp system/dannet.service /etc/systemd/system/dannet.service
systemctl enable dannet
systemctl start dannet
更新 Web 服务
要更新 Web 服务软件而不更改数据库:
# From the docker/ directory
docker compose up -d dannet --build
数据库发布工作流
发布数据库新版本时:
-
将 dk.cst.dannet.release 中的
to设为 新版本,并让from保持为用于引导的发布版本。只有两者不同时,make-release-changes!中针对发布版本的更改才会运行。 -
通过
dk.cst.dannet.web.service中的 REPL 构建数据库:(restart) -
生成导出文件,每个文件都在各自的命名空间中生成:
(dk.cst.dannet.db.export.rdf/export-rdf! @dk.cst.dannet.web.resources/db) (dk.cst.dannet.db.export.csv/export-csv! @dk.cst.dannet.web.resources/db) (dk.cst.dannet.db.export.wn-lmf/export-wn-lmf! "export/wn-lmf/") (dk.cst.dannet.db.export.dmlex/export-dmlex-variants! "export/dmlex/" @dk.cst.dannet.web.resources/db) ;; ~6 minutes (dk.cst.dannet.db.query/save-synset-indegrees! (:graph @dk.cst.dannet.web.resources/db))这会写入
export/rdf/(dannet.zip、cor.zip、cor-sem.zip、framenet.zip、dds.zip、oewn-extension.zip)、export/csv/dannet-csv.zip、export/wn-lmf/dannet-wn-lmf.xml.gz、export/dmlex/(dannet-dmlex-da.zip、dannet-dmlex-en.zip)以及export/synset-indegree.edn。这些文件会部署到 生产环境(第 7 步),并成为下一轮用于引导的 GitHub 发布资产(第 4 步)。 -
发布一个标记为
v<version>的 GitHub 版本,并附上 dk.cst.dannet.db.bootstrap.downloads 中bootstrap-files列出的引导资产:dannet.zip、cor.zip、cor-sem.zip、dds.zip、oewn-extension.zip和synset-indegree.edn。下一轮会从 GitHub 获取这些文件。 -
压缩数据库,然后在开发机上将其打包为 zip,以备传输:
(dk.cst.dannet.db/compact! (:dataset @dk.cst.dannet.web.instance/db))TDB2 只有在压缩后才会回收原地更新留下的空间,并会写入新的
Data-000N代,因此之后要重启服务。传输前,检查数据库大小除以三元组数量所得的值 是否在数百字节,而不是数千字节。 -
停止生产环境上的服务:
docker compose stop dannet -
通过 SFTP 传输数据库和导出文件,然后:
unzip -o tdb2.zip -d /dannet/db/ mv cor.zip cor-sem.zip framenet.zip dannet.zip dds.zip oewn-extension.zip /dannet/export/rdf/ mv dannet-csv.zip /dannet/export/csv/ mv dannet-wn-lmf.xml.gz /dannet/export/wn-lmf/ mv dannet-dmlex-da.zip dannet-dmlex-en.zip /dannet/export/dmlex/ -
部署第 3 步生成的
export/synset-indegree.edn。生产环境使用--no-bootstrap,因此不会下载它,但查询时会读取该文件,用于对搜索结果 和实体关系进行排序;该文件应反映实际部署的数据库。两个位置都可以,第一个 优先(参见 dk.cst.dannet.db.query 中的indegrees-files):mv synset-indegree.edn /dannet/db/ # legacy location mv synset-indegree.edn /dannet/bootstrap/from/2026-08-03/ # alongside the bootstrap inputs如果两处都不存在,服务仍会启动,搜索也仍然可用,但结果不会排序,并且会记录
:dannet.query/indegrees-unavailable错误。 -
重启:
docker compose up -d dannet --build -
将
from更新为新版本并删除to,这样to就会再次默认为from。 清除make-release-changes!中针对发布版本的代码块:其中的更改已随本次 发布部署。这就为下一轮做好了准备。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。