dannet について
DanNet はデンマーク語の WordNet で、データベース、アプリケーション、シリアライズの各層で RDF を標準の表現形式としています。デンマーク語の語彙意味関係を必要とする研究者や開発者を想定しており、SPARQL で問い合わせできます。MCP 経由で AI ツールから接続するリモートサーバーも提供されています。
主な機能
- 01デンマーク語の語彙意味関係データ
- 02Ontolex-lemon と GWA 関係に基づく RDF 表現
- 03RDF、CSV、WN-LMF、DMLex の複数フォーマット
- 04Apache Jena による SPARQL クエリ
- 05COR、DDS などの関連データセット
活用シーン
- 01デンマーク語の NLP 研究向けの語義関係データの提供
- 02Claude などの AI ツールからの意味関係の問い合わせ
- 03デンマーク語 WordNet データの wn ライブラリへの取り込み
MCP 対応
このプロジェクトはリモートサーバー(https://wordnet.dk/mcp)として MCP サーバーを提供し、DanNet の意味関係の問い合わせ機能を MCP クライアントに公開します。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
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 | wn などの Python ライブラリと互換性のある XML 形式です。 |
| 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 "?"))
形式間の違い
すべての形式にすべての synset/sense/word が含まれていますが、CSV、WN-LMF、DMLex の各バリアントにはすべてのデータポイントが含まれるわけでは ありません。
- CSV: オープングラフから固定テーブルに変換する際に一部のデータが失われます。
- WN-LMF: 標準に従い、公式の GWA 関係のみが含まれます(DanNet スキーマ の独自の DanNet 関係は除外されます)。
- DMLex: DanNet を COR、DDS、COR.SEM と 1 つのファイルに統合したものです。他のデータセットへの関係は含まれません。変換ルールについては doc/dmlex/plan.md を参照してください。
完全なデータセットについては、RDF 形式を使用するか、wordnet.dk で閲覧してください。
コンパニオンデータセット
いくつかのコンパニオンデータセットが、追加データで RDF グラフを拡張します。
| データセット | 説明 |
|---|---|
| COR | DanNet のリソースを COR プロジェクトの ID にリンクします。 |
| DDS | DanNet のリソースにセンチメントデータを追加します。 |
| OEWN 拡張 | Open English WordNet に DanNet 形式のラベルを提供し、2 つのデータセット間の接続の閲覧を容易にします。 |
推論データ
追加データは、ベースデータセット、コンパニオンデータセット、およびオントロジーメタデータから暗黙的に推論されます。これらの推論結果は wordnet.dk で閲覧できます。完全に推論されたグラフを含むリリースは、そのように明示的にマークされています。
標準
DanNet は、Ontolex-lemon 標準と、Global Wordnet Association によって定義され公式の 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 リソースに解決されます。これらの URI のいずれかに GET リクエストでアクセスすると、そのリソースのデータが返されます。
スキーマ
DanNet には、Ontolex 互換の方法で DanNet スキーマに定義された独自の関係があります。EuroWordNet 概念用のスキーマもあります。どちらのスキーマも、Philippe Martin によって挙げられた RDF 規約に従っています。
LLM 統合
DanNet は、MCP(Model Context Protocol)を介して 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 です。これは OWL 推論をサポートする成熟した RDF トリプルストアです。Jena で表現されると、DanNet の関係はクエリ可能なナレッジグラフを形成します。DanNet は Clojure で開発されており、Jena とやり取りするために Aristotle などのライブラリを使用しています。
設計上の決定の詳細については、rationale.md を参照してください。
本番環境の完全なセットアップ
wordnet.dk の本番デプロイは、Docker Compose で管理される 3 つのサービスで構成されています。
- DanNet — Clojure/ClojureScript の Web アプリケーション
- MCP サーバー — DanNet への LLM アクセスを提供する Python ベースの MCP サーバー
- Caddy — HTTPS とルーティングを処理するリバースプロキシ
Clojure サポート
DanNet は Clojure からさまざまな方法でクエリできます(queries.md を参照)。Apache Jena のトランザクションは組み込まれており、TDB 2 レイヤーによる永続化を可能にします。
Web アプリケーション
フロントエンドは ClojureScript で Rum を使用して書かれており、Pedestal によって配信されます。このアプリは、シングルページアプリケーション(JavaScript あり)としても、通常の HTML Web サイト(JavaScript なし)としても動作します。コンテンツネゴシエーションにより、リクエストに基づいて異なる表現(HTML、RDF、Transit+JSON)が配信されます。
詳細については、doc/web.md を参照してください。
ブートストラッププロセス
新しいリリースは、直前のリリースからブートストラップされます。このプロセス(dk.cst.dannet.db.bootstrap 内)は次のとおりです。
- 前バージョンの RDF データを読み込み、クリーンアップします
- 現在のスキーマを使用してトリプルに変換します
- Apache Jena グラフにインポートし、リリースの変更を適用します(リリースを切るとき、つまり
toがfromと異なるときのみ) - OWL/RDFS スキーマを介して追加のトリプルを推論します
- 最終的な RDF データセットをエクスポートします(データベースリリースワークフローを参照)
ブートストラップデータは、実行ディレクトリからの相対パス
./bootstrapの下に置かれます。./bootstrap/from/<version>/にある DanNet リリースアセット(ブートストラップ元の リリースにちなんで命名されるため、複数を共存させることができます)と、./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 の利用可能な RAM が必要です。
RDF の検証(SHACL)
dn: データセットは、resources/schemas/internal/shapes/ にある SHACL シェイプに対して検証されます(dk.cst.dannet.db.shapes を参照)。これはいくつかの方法で行われます。
- アサートされたグラフの非致命的なチェックが起動のたびに非同期で実行され、違反をログに記録し、カウントを既知のベースラインと比較します。
dn:データセットの RDF エクスポートはゲート制御されます。ベースラインのリグレッションが発生するとエクスポートは中止されます。- フィクスチャベースのテストは
clojure -X:validate:testを介して実行され、これは .github/workflows/test.yml の GitHub Actions ワークフローによっても実行されます。
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 の本番サーバーは、Docker に委任する systemd サービスとして実行されます。
サービスのセットアップ
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!内のリリース固有の変更は、この 2 つが異なって初めて実行されます。 -
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 サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。