RDFファイルのルート要素とは、rdf:RDFタグのある括弧< >ことである。
勿論、文書最後のもルート要素を特定させる記述であるが、属性は先頭にしか設定されない。
PythonでオントロジーOWLファイルを生成するにはowlready2を利用するのが便利だ。しかし、rdf:RDFタブのあるルート要素の属性は、つまり接頭辞の定義の情報は固定になってしまうのだ。
そこで、rdf:RDF要素の属性を追加するには、rdflibを利用することになる。
1. Owlready2の制約と動作
Owlready2は、オントロジーの保存時、必須の標準名前空間 (rdf, rdfs, owl, xsd) と、オントロジー自身の IRI (xml:base と xmlns) のみを出力する。
インポートされたオントロジーや外部 IRI に対する xmlns: 宣言は、ほとんどの場合、自動的には生成されない。
Owlready2は、オントロジー内のすべての IRI を完全な形 (http://...#Entity) で書き出すことで、プリフィックス宣言の欠如に対応する。
RDF/XML形式では、接頭辞付きエンティティ (prfx:entity1) の代わりに完全な IRI (http://...#entity1) を使用することが許容されており、Owlready2は可読性よりもRDF/OWLの文法的な正確性の範囲で、接頭辞を避けているためだ。
2. rdf:RDFの属性を設定する方法
owlready2のAPIを使用して、rdf:RDF要素に任意の xmlns: 宣言を強制的に追加する方法は存在しない。
xmlファイルとしてXMLファイルのDOMライブラリを利用して修正する方法もある。それが一番汎用的だし、RDFファイルを扱うのにXMLのDOMを利用するのはいろいろと都合が良いこともあり、ある意味でお勧めできる。
しかし、OWLオントロジーファイルらしいやり方もある。
RDFlib を使用して保存をカスタマイズするのだ。
PythonのRDF処理ライブラリである RDFlib を使用して、Owlready2が生成したRDFグラフをロードし直し、必要なプリフィックスを明示的に定義して、RDF/XMLとして保存するのだ。
実装例
OWLのRDFファイルを次とする。
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xml:base="http://www.jsds.com/2025/11/hhhhhhh01"
xmlns="http://www.jsds.com/2025/11/hhhhhhh01#">
<owl:Ontology rdf:about="http://www.jsds.com/2025/11/hhhhhhh01">
<owl:imports rdf:resource="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01"/>
<hasBBB1Reference rdf:resource="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01#TempBBB1Class"/>
</owl:Ontology>
<owl:AnnotationProperty rdf:about="#hasBBB1Reference"/>
</rdf:RDF>
オントロジーのベースxml:base="http://www.jsds.com/2025/11/hhhhhhh01" であり、オントロジーのIRIはxmlns="http://www.jsds.com/2025/11/hhhhhhh01#"> である。オントロジーそのものIRIや接頭辞は出力されている。
しかし、接頭辞xml:bbb1="http://www.jsds.com/2025/11/bbbbbbb01" もrdf:RDF要素の属性として出力したいとする。
このときは、一度RDFファイルをowlready2で出力しておいてから、次のようにしてrdf:RDFの部分をRDFlibを利用して修正する。
import rdflib
# 1. Owlready2で保存したファイル(heki1.rdf)をRDFlibでロード
g = rdflib.Graph()
g.parse("hhh1.rdf", format="xml")
# 2. 必要なプリフィックスを明示的に登録
BBB1_IRI = "http://www.semanticweb.org/ontologies/2024/4/bbbbbbbb01"
g.bind("bbb1", BBB1_IRI)
# 注: RDFlibでは末尾の # が不要な場合が多い。
# BBB1 IRI の末尾が "/" の場合(XMLから判断)は修正のこと。
# 3. プリフィックスを含む新しいRDF/XMLファイルとして保存
# 'pretty-xml' フォーマットが整ったXMLを出力。
g.serialize(destination="hhh1_final.rdf", format="pretty-xml")
この結果生成されるファイルは次のようになる。
実は、利用されていないIRI(接頭辞のIRI+フラグメント(#))は出力されない。
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:bbb1="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>
<owl:Ontology rdf:about="http://www.jsds.com/2025/11/hhhhhhh01">
<owl:imports rdf:resource="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01"/>
<budd:hasBBB1Reference rdf:resource="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01#TempBBB1Class"/>
</owl:Ontology>
</rdf:RDF>
なお、これをprotégéで読み込んで保存すれば、rdf:RDF要素は次のように埋められる。
<?xml version="1.0"?>
<rdf:RDF xmlns="http://www.jsds.com/2025/11/hhhhhhh01#"
xml:base="http://www.jsds.com/2025/11/hhhhhhh01"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:xml="http://www.w3.org/XML/1998/namespace"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:bbb1="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
<owl:Ontology rdf:about="http://www.jsds.com/2025/11/hhhhhhh01">
<owl:imports rdf:resource="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01"/>
<budd:hasBBB1Reference rdf:resource="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01#TempBBB1Class"/>
</owl:Ontology>
<!--
///////////////////////////////////////////////////////////////////////////////////////
//
// Annotation properties
//
///////////////////////////////////////////////////////////////////////////////////////
-->
<!-- http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01#hasBBB1Reference -->
<owl:AnnotationProperty rdf:about="http://www.semanticweb.org/ontologies/2024/4/bbbbbbb01#hasBBB1Reference"/>
</rdf:RDF>
<!-- Generated by the OWL API (version 4.5.29.2024-05-13T12:11:03Z) https://github.com/owlcs/owlapi -->