![]() | |
| 開発者 | Daniel Krech (作成者)、Gunnar Grimnes、Joern Hees (過去のメンテナ)、Nicholas J. Car (メンテナ) |
|---|---|
| 初回リリース | 2002年6月4日 |
| 安定版リリース | 6.2.0 / 2022年7月16日[1] |
| リポジトリ |
|
| 書かれた | パイソン |
| オペレーティング·システム | クロスプラットフォーム |
| タイプ | 図書館 |
| ライセンス | BSDA の |
| Webサイト | rdflib.dev |
RDFLibは、情報を表現するためのシンプルでありながら強力な言語であるRDF [2]を操作するためのPythonライブラリです。このライブラリには、RDF/XML、Turtle、N-Triples、JSON-LDなど、既知のRDFシリアル化のほぼすべてに対応するパーサー/シリアライザーが含まれており、その多くは現在更新された形式(例:Turtle 1.1)でサポートされています。また、このライブラリには、RDF情報を保存するためのメモリ内および永続的なグラフバックエンドと、グラフ名前空間の宣言、SPARQL [3]クエリの格納などのための多数の便利な関数が含まれています。継続的に開発されており、最新の安定リリースであるrdflib 6.1.1は2021年12月20日にリリースされました。元々はDaniel Krechによって作成され、2002年11月に最初のリリースが行われました。
他にも、次のような多くの Python プロジェクトで RDF 操作に rdflib が使用されています。
- OWL-RL - OWL2 RLプロファイル[4](推論エンジン)のシンプルな実装
- pySHACL - Python SHACLバリデーター
- pyLDAPI -リンクデータの配信に使用されるPython Flask Web フレームワークのアドオン モジュール
- pyLODE - Web オントロジー言語ドキュメントツール
歴史と現状
概要
RDFLib と Python のイディオム
RDFLib はさまざまな Python表現法を使用しているため、Python の初級スキルしか持たないプログラマーでも RDF を操作するのは非常に簡単です。一方、Python 表現法は十分に単純なので、RDF には精通しているが Python には精通していない人でも、rdflib の使い方をかなり簡単に理解できるでしょう。
g3 = g1 + g2RDFLib のコア クラスは Graph です。これは、メモリ内に RDF トリプルのコレクションを格納するために使用される Python 辞書です。これは、加算による単純なグラフのマージ (つまり)
などの単純なグラフ動作を示すために、特定の組み込み Python オブジェクト メソッドを再定義します。
RDFLib グラフはコンテナ タイプをエミュレートし、3 項目のトリプルのセットとして考えるのが最適です。
セット([
(主語、述語、目的語)、
(主語1、述語1、目的語1)、
...
(主語N、述語N、目的語N)
])
RDFLib グラフはソートされたコンテナではなく、add()トリプルを検索して任意の順序で返すメソッドなど、通常の Python セット操作を備えています。
RDFグラフ用語
以下の RDFLib クラス (下記にリスト) は、グラフ内の RDF 用語をモデル化し、Python unicode を拡張する共通の Identifier クラスから継承します。これらのインスタンスは、RDF グラフ内のノードです。
- URIRef
- Bノード
- リテラル
- 変数
名前空間ユーティリティ
RDFLib は、名前空間を管理するためのメカニズムを提供します。特に、名前空間のベース URI を (唯一の引数として) 受け取る Namespace クラスがあります。名前空間内の完全修飾 URI は、Namespace インスタンスの属性/辞書アクセスによって構築できます。
>>> rdflibから Namespaceをインポート>>> SDO = Namespace ( "https://schema.org/" ) >>> SDO . Person https://schema.org/Person >>> SDO [ 'url' ] https://schema.org/url
反復子としてのグラフ
RDFLib グラフは、含まれるトリプルの 反復処理をサポートするために__ iter __ もオーバーライドします。
someGraphのsubject 、 predicate 、 object_ について: someGraphのassert ( subject 、predicate 、object_ ) 、「イテレータ/コンテナ プロトコルが壊れています!!」
RDFLib グラフ上の集合演算
__ iadd __ と __ isub __ は、グラフ同士の加算と減算をサポートするためにオーバーライドされます (インプレース):
- G1 += G1
- G2 -= G2
基本的なトリプルマッチング
RDFLib グラフは、トリプル((主語、述語、目的語)) 関数を使用した基本的なトリプル パターン マッチングをサポートします。この関数は、引数で指定されたパターンに一致するトリプルを生成するジェネレーターです。これらの引数は、返されるトリプルを制限する RDF 用語です。None の用語はワイルドカードとして扱われます。
for subject 、 predicate 、 object_ in someGraph . triples (( None 、 URIRef ( "https://schema.org/name" )、 None )):
print ( " {} has name {} " . format ( s 、 o )) # 述語が https://schema.org/name であるすべてのトリプルを出力します
RDF 便利な API (RDF コレクション / コンテナ)
トリプルの管理
トリプルの追加
トリプルは次の 2 つの方法で追加できます。
- これらは、 parse ( source、publicID = None、format ="xml") 関数を使用して追加できます。最初の引数はさまざまな種類のソースにすることができますが、最も一般的なのはシリアル化です (さまざまな形式: RDF/XML、Notation 3、RDF グラフのN-Triples を文字列として)。formatパラメーターは、turtle、n3、xml、n-triples、またはJSON-LD (JSON-LD プラグインが使用されている場合は最後の JSON-LD) のいずれかです。publicIDは、 RDF シリアル化が解析されるグラフの名前です。
- トリプルはadd関数を使用して追加することもできます: add (( subject , predicate , object ))。
トリプルの削除
同様に、トリプルはremove呼び出しによって削除できます: remove ((主語、述語、目的語))
RDFリテラルのサポート
RDFLib のリテラルは、基本的にXML スキーマデータ型または言語属性を持つ Unicode 文字のように動作します。このクラスは、Python リテラル (および time/date/datetime などの組み込み) を同等の RDF リテラルに変換するメカニズムと、(逆に) リテラルを Python の同等のリテラルに変換するメカニズムを提供します。リテラル インスタンスを比較する際にデータ型を考慮するサポートがいくつかあり、__ eq __ のオーバーライドとして実装されています。Python リテラルとの間のこのマッピングは、次の辞書を使用して実現されます。
PythonToXSD = {
basestring : ( None , None ),
float : ( None , XSD_NS + u 'float'), int:(None, XSD_NS + u ' int ' ) , long : ( None , XSD_NS + u ' long ' ) , bool : ( None , XSD_NS + u ' boolean ' ) , date : ( lambda i : i.isoformat ( ), XSD_NS + u ' date' ), time : ( lambda i : i.isoformat (), XSD_NS + u ' time ' ), datetime : ( lambda i : i.isoformat () , XSD_NS + u ' dateTime ' ) , }
PythonインスタンスをWXSデータ型リテラルにマッピングします
XSDToPython = {
XSD_NS + u 'time' : ( None 、 _strToTime )、
XSD_NS + u 'date' : ( None 、 _strToDate )、
XSD_NS + u 'dateTime' : ( None 、 _strToDateTime )、
XSD_NS + u 'string' : ( None 、 None )、
XSD_NS + u 'normalizedString' : ( None 、 None )、
XSD_NS + u 'token' : ( None 、 None )、
XSD_NS + u 'language' : ( None 、 None )、
XSD_NS + u 'boolean' : ( None 、 lambda i : i . lower () in [ '1' 、'true' ] )、
XSD_NS + u 'decimal' : ( float 、 None )、
XSD_NS + u 'integer' : ( long 、 None )、
XSD_NS + u 'nonPositiveInteger' : ( int 、 None )、
XSD_NS + u 'long' : ( long 、 None )、
XSD_NS + u 'nonNegativeInteger' : ( int 、 None ) 、
XSD_NS + u 'negativeInteger' : ( int 、 None )、
XSD_NS + u 'int' : ( int 、 None )、
XSD_NS + u 'unsignedLong' : ( long 、 None )、
XSD_NS + u 'positiveInteger' : ( int , なし),
XSD_NS + u 'short' : ( int , None )、
XSD_NS + u 'unsignedInt' : ( long , None ) 、
XSD_NS + u 'byte' : ( int , None )、
XSD_NS + u 'unsignedShort' : ( int , None )、
XSD_NS + u 'unsignedByte' : ( int , None )、
XSD_NS + u 'float' : ( float , None )、
XSD_NS + u 'double' : ( float , None )、
XSD_NS + u 'base64Binary' : ( base64 . decodestring , None )、
XSD_NS + u 'anyURI' : ( None , None )、
}
WXS データ型のリテラルを Python にマッピングします。このマッピングは、すべてのリテラル インスタンスで定義されているtoPython () メソッドによって使用されます。
SPARQLクエリ
RDFLIb は、現在のSPARQL 1.1仕様の大部分をサポートしており、公開されている RDF DAWG テスト スイート用のハーネスが含まれています。SPARQL のサポートは、次の 2 つの方法で提供されます。
rdflib.graph.query()-グラフ(またはグラフのストア)にSPARQL SELECTまたはASKクエリを実行するために使用されます。rdflib.graph.update()- INSERT、DELETE、CONSTRUCT SPARQLステートメントを使用してグラフコンテンツを変更したり、RDFを返したりするために使用されます。
シリアル化 (NTriples、N3、RDF/XML)
RDF ストア API
ユニバーサルRDFストアインターフェース
このドキュメントでは、RDF ストアの基本的なコンポーネントをいくつかまとめます。目的は、RDF グラフを特定の実装に縛られない普遍的な方法で永続化するために必要なサポートを提供するための標準のインターフェイス セットの概要を示すことです。ほとんどの部分で、コア RDF モデルと、RDF モデル仕様と一致する用語が遵守されています。ただし、この提案されたインターフェイスは、RDF モデルを超えて、一階述語論理処理と永続化のフレームワークを提供する Notation 3 の側面を促進するために必要な追加要件で RDF ストアを拡張します。
用語
- コンテクスト
- 名前が付けられた、順序付けられていないステートメントのセット。サブグラフとも呼ばれます。名前付きグラフの文献とオントロジーはこの概念に関連しています。コンテキストは、RDF トリプルと、それが見つかるサブグラフ (これは、Notation 3 の設計上の問題のページにおけるコンテキストという用語の使用法です) またはサブグラフ自体との関係としてのみ考えることができます。
- トリプルをアドレス可能な「セット」または「サブグラフ」内で論理的にグループ化するという概念は、RDF モデルの範囲をわずかに超える程度であることは注目に値します。RDF モデルでは、グラフをトリプルの任意のコレクションとこれらのトリプルのセマンティクスとして定義していますが、このような任意のコレクションを一貫してアドレス指定する方法についてはガイダンスを提供していません。トリプルのコレクション自体はリソースとして考えることができますが、トリプルとそれが属するコレクションとの関連性については説明されていません。
- 連言グラフ
- これは「トップレベル」のグラフを指します。これはグラフ内のすべてのコンテキストの集約であり、閉じた世界の仮定/モデルの適切で絶対的な境界でもあります。この区別は、セマンティック ウェブへの道に沿った RDF の簡単に得られる部分であり、その価値のほとんどは (企業/エンタープライズ) の現実世界の問題にあります。
- 閉世界仮説が使用される状況は少なくとも2つあります。1つ目は、知識ベースにすべての関連事実が含まれていると想定される場合です。これは企業のデータベースでよく見られます。つまり、そこに含まれる情報は完全であると想定されます。
- ストアの観点から見ると、閉世界仮定は、明示的な閉世界境界により、クエリ応答時間が向上するという利点もあります。閉世界境界は、各 ConjunctiveGraph がより大きな境界のない宇宙の一部であると想定するフェデレーション クエリによって透過的にすることができます。したがって、閉世界仮定は、開世界仮定を妨げるものではありません。
- 永続性を保つために、連言グラフは識別子によって区別される必要があります (識別子は必ずしも RDF 識別子である必要はなく、データベースの命名目的で SHA1/MD5 などの正規化された RDF 識別子である場合もあります)。識別子は、連言クエリ (連言グラフ全体にわたって行われるクエリ) を示すために参照されるか、またはアサートされたステートメントのノードとして表示されます。後者の場合、そのようなステートメントは「既知の」宇宙全体について行われたものとして解釈される可能性があります。たとえば、次のようになります。
<urn:uuid:conjunctive-graph-foo> rdf :タイプ : ConjunctiveGraph
<urn:uuid:conjunctive-graph-foo> rdf :タイプ ログ:真実
<urn:uuid:conjunctive-graph-foo> :永続化元 : MySQL
- 引用文
- 断言はされていないが、何らかの方法で参照されている文。ほとんどの場合、これは、引用された文が必ずしも真実であるとは言わずに、別の文(または文のセット)について発言したい場合に発生します。例:
Chimezie氏は「高階文は複雑だ」と述べた。
- これは(N3では)次のように書くことができます。
: chimezie :言った {: higherOrderStatements rdf : type : complex }
- 式
- 発言が引用または仮説されているコンテキスト。
- コンテキスト引用は具体化と非常によく似ていると考えられる。主な違いは、引用された文は宇宙についての真実の文として主張されたり考慮されたりせず、グループとして参照できる点である。仮想的なRDFグラフ
- 普遍的量指定子/変数。(関連参考文献):
- SWRL の OWL 定義。(参照)
- SWRL/RuleML変数
- 条項
- 用語は、引用/表明されたトリプルに出現できるオブジェクトの種類です。これには、RDF の中核となるものが含まれます。
- 空白ノード
- URI 参照
- リテラル(リテラル値、データ型、言語タグで構成される)
- RDF モデルを N3 に拡張するもの:
- 公式
- 普遍的数量化(変数)
- そして、主に基礎となるグラフ内の「ノード」と照合するためのものは次のとおりです。
- 正規表現
- 日付範囲
- 数値範囲
- ノード
- ノードは、基礎となるストアが実際に保持する用語のサブセットです。このような用語のセットは、ストアがフォーミュラ対応であるかどうかによって異なります。フォーミュラ対応でないストアは、RDF モデルのコアとなる用語のみを保持し、フォーミュラ対応のストアは N3 拡張も保持できます。ただし、用語パターンによるノードのマッチングのみを目的とするユーティリティ用語は、おそらくノードではなく用語のみになります。
- 「RDF グラフのノード セットは、グラフ内のトリプルの主語と目的語のセットです。
- コンテキスト認識
- コンテキスト内にステートメントを保存できる RDF ストアは、コンテキスト対応型と見なされます。基本的に、このようなストアは、表現する RDF モデルを個別の名前付きアドレス指定可能なサブグラフに分割できます。
- 数式認識
- アサートされたステートメントと引用されたステートメントを区別できる RDF ストアは、数式対応であると見なされます。
- このようなストアは、この分離を維持し、モデル全体 (すべてのコンテキストの集約 - 'クエリ' を特定の名前のコンテキストに限定しないことで指定) に対するクエリに引用符で囲まれたステートメントが含まれないようにする役割を担います。また、普遍量指定子 (変数) を区別する役割も担います。
- これら 2 つの追加概念 (数式と変数) は、コア拡張機能として考え、トリプルの他の用語とは区別する必要があります (少なくとも永続性のラウンドトリップのために)。普遍量指定子 (変数) と存在量指定子 (BNode) の「スコープ」は、それらのステートメントが存在する数式 (または具体的にはコンテキスト) であることに注意してください。これ以外では、数式対応ストアはコンテキスト対応ストアと同じように動作します。
- 結合クエリ
- ストアを名前付きコンテキスト内のみで検索するように制限しないクエリ。このようなクエリでは、コンテキスト対応ストアがアサートされたユニバース全体 (結合グラフ) を検索することが想定されています。数式対応ストアでは、このようなクエリを照合するときに引用符で囲まれたステートメントを含めないことが想定されています。
- N3往復
- これは、N3 パーサーによって適切に設定され、N3 シリアライザーによって構文としてレンダリングされるために必要な、数式対応 RDF ストアの永続化メカニズムの要件を指します。
- トランザクションストア
- 実行される RDF 操作にトランザクションの整合性を提供できる RDF ストア。
構文の解釈
次の Notation 3 ドキュメント:
{ ?x a : N3Programmer } => { ?x : [ a :偏頭痛]がある}
ストアで次のステートメントがアサートされる可能性があります。
_ : a log :は_ : bを意味する
このステートメントは、引用符で囲まれたステートメントに関連付けられたパーティション(_:a という名前の式内)でアサートされます。
?x rdf :タイプ : N3Programmer
最後に、これらのステートメントは同じパーティション(_:bという名前の式)でアサートされます。
?x :は_ : c を持つ
_ : c rdf : type :片頭痛
式と変数を項として使う
数式と変数は、次の構文によって URI 参照、リテラル、BNode と区別できます。
{ .. } - 式
?x - 変数
また、ラウンドトリップが可能であることを確認するために、永続性において区別可能でなければなりません。N3 用語の永続性に関するその他の問題。
データベース管理
RDF ストアは、データベース接続の管理のための標準インターフェースを提供する必要があります。このようなインターフェースは、ほとんどのデータベース管理システム (Oracle、MySQL、Berkeley DB、Postgres など) の標準です。この機能を提供するために、次のメソッドが定義されています。
- def open(self, configuration, create=True) - 構成文字列で指定されたストアを開きます。create が True の場合、ストアがまだ存在しない場合は作成されます。create が False でストアがまだ存在しない場合は例外が発生します。ストアが存在するが、ストアを開くための権限が不十分な場合も例外が発生します。
- def close(self, commit_pending_transaction=False) - これにより、データベース接続が閉じられます。commit_pending_transaction パラメータは、閉じる前にすべての保留中のトランザクションをコミットするかどうかを指定します (ストアがトランザクションの場合)。
- def destroy(self, configuration) - 構成文字列によって識別されるストアのインスタンスを破棄します。
構成文字列はストア実装によって認識され、ストアの個々のインスタンスを見つけるために必要なすべてのパラメータを表します。これは ODBC 文字列に似ている場合もあれば、基盤となるデータベースへの接続プロトコルが ODBC である場合は実際に ODBC 文字列である場合もあります。open 関数は、create の値に応じて、(指定された構成文字列によって識別される) ストアが既に存在するか、(構成文字列によって指定された場所に) ストアが存在しないかを明確に表現するために、インテリジェントに失敗する必要があります。
トリプルインターフェース
RDF ストアは、含まれるトリプル (アサートまたは引用) の操作、管理、および/または取得のための標準的なインターフェース セットを提供できます。
- def add(self, (subject, predicate, object), context=None, quoted=False) - 指定されたステートメントを特定のコンテキストまたはモデルに追加します。引用符で囲まれた引数は、数式対応ストアによって解釈され、このステートメントが引用符で囲まれている/仮説的であることを示します。コンテキストを指定せず、引用符で囲まれた引数が True である場合はエラーになります。ストアが数式に対応していない場合、引用符で囲まれた引数が True である場合もエラーになります。
- def remove(self, (主語, 述語, 目的語), コンテキスト)
- def triples(self, (subject, predicate, object), context=None) - 指定されたパターンに一致するすべてのトリプル (連言グラフ内または指定されたコンテキストのみ) の反復子を返します。パターンは、明示的なステートメント用語 (基礎となるストア内のノードと照合するために使用される) またはワイルドカードを示す None を提供することによって指定されます。注: このインターフェースは、一致するステートメントの 3 つの用語に対応する長さ 3 のタプルの反復子を返すことが想定されています。一致するステートメントの用語は、URIRef、空白ノード、リテラル、式、変数、または (おそらく) コンテキストのいずれかになります。
この関数は、提供された対応する用語と用語パターンに一致するノードを持つトリプルを生成するための主要なメカニズムと考えることができます。結合クエリは、コンテキストに NULL/なし/空の文字列値を指定するか、結合グラフに関連付けられた識別子を指定することで示されます。
- def __len__(self, context=None) - ストア内のステートメントの数。コンテキストが指定されていない場合は、引用符で囲まれていない (アサートされた) ステートメントのみを考慮し、それ以外の場合は、指定された式またはコンテキスト内のステートメントの数を返す必要があります。
数式 / コンテキスト インターフェース
これらのインターフェースは、コンテキストと数式 (数式を認識するストアの場合) で互換的に機能します。
- def contexts(self, triple=None) - グラフ内のすべてのコンテキストのジェネレーター。triple が指定されている場合は、triple が含まれるすべてのコンテキストのジェネレーター。
- def remove_context(自己、識別子) -
名前付きグラフ / 連言グラフ
RDFLib は次の種類のグラフを定義します。
- 'グラフ'(_ストア_、_識別子_)
- 'QuotedGraph'(_ストア_、_識別子_)
- 'ConjunctiveGraph'(_ store _,_ default _ identifier _= None )
連言グラフは、閉世界仮定の境界であると考えられる最も関連性の高いグラフのコレクションです。この境界は、ストア インスタンスの境界に相当します (ストア インスタンス自体は一意に識別され、他の連言グラフを示すストアの他のインスタンスとは異なります)。これは、その中のすべての名前付きグラフに相当し、識別子が指定されていない場合は、識別子の BNode が自動的に割り当てられる _default_ グラフに関連付けられます。
公式
RDFLib グラフは、数式に対する RDF セマンティクスの追加拡張をサポートします。学術的な興味がある方には、Graham Klyne の「正式な」拡張 (外部リンクを参照) がおそらく良い読み物です。
数式は「QuotedGraph」クラスによって正式に表現され、その文が引用されている点で通常の RDF グラフとは分離されています。
持続性
RDFLib は、 RDF およびNotation 3の永続化のために抽象化された Store APIを提供します。Graph クラスは、この API のインスタンス (コンストラクタの最初の引数として) と連携して、ガベージ コレクション、トランザクション管理、更新、パターン マッチング、削除、長さ、データベース管理 ( _ open _ / _ close _ / _ destroy _ ) を含む、RDF ストアのトリプル ベースの管理を行います。この API を別のストアに実装することで、追加の永続化メカニズムをサポートできます。現在サポートされているデータベース:
ストアインスタンスはプラグイン関数を使用して作成できます:
from rdflib import plugin
from rdflib.store import Store
plugin . get ( '.. サポートされているストアの 1 つ ..' , Store )( identifier =.. 結合グラフのID .. )
「高次の」慣用句
RDFLib グラフを他の Python 言語に拡張する高レベル API がいくつかあります。より明示的な Python バインディングには、Sparta、SuRF、FunOWL があります。
参考文献
- ^ "rdflib/CHANGELOG.md at 6.2.0 · RDFLib/rdflib · GitHub".
- ^ Cyganiak, Richard; Wood, David; Lanthaler, Markus (2014-02-25)、RDF 1.1 概念と抽象構文、W3C 、 2020-04-18取得
- ^ Harris, Steve; Seaborne, Andy (2013-03-21)、SPARQL 1.1 クエリ言語、W3C 、 2020-04-18取得
- ^ Motik, Boris; Cuenca Grau, Bernardo; Horrocks, Ian; Wu, Zhe; Fokoue, Achille; Lutz, Carsten (2012-12-11)、OWL 2 Webオントロジー言語プロファイル(第2版)、W3C 、 2020-04-18取得
外部リンク
- 公式サイト
- GitHub上の RDFLib

