0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

PythonででRDFのルート要素の属性を追加する

Posted at

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を利用して修正する。

rdflibを利用したrdf:RDF属性設定
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 -->
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?