hardf 、Linked Data (RDF) を処理できるようにする PHP 7.1 以降のライブラリです。それは以下を提供します:
パーサーとシリアライザーの両方がストリーミングをサポートしています。
このライブラリは、N3.js を PHP に移植したものです。
NodeJS N3.js ライブラリから移植された PHP のトリプル表現を使用します。詳細については、https://github.com/rdfjs/N3.js/tree/v0.10.0#triple-representation を確認してください。
意図的に、私たちは開発者の使いやすさではなく、パフォーマンスに焦点を当てました。したがって、PHP オブジェクトではなく連想配列を使用してこのトリプル表現を実装しました。したがって、N3.js の場合と同じことが配列になります。例えば:
<?php
$ triple = [
' subject ' => ' http://example.org/cartoons#Tom ' ,
' predicate ' => ' http://www.w3.org/1999/02/22-rdf-syntax-ns#type ' ,
' object ' => ' http://example.org/cartoons#Cat ' ,
' graph ' => ' http://example.org/mycartoon ' , #optional
];
リテラルを次のようにエンコードします (N3.js と同様)
' "Tom"@en-gb ' // lowercase language
'" 1 "^^http: //www.w3.org/2001/XMLSchema#integer' // no angular brackets <>
Composer を使用してこのライブラリをインストールします。
composer require pietercolpaert/ hardf
use pietercolpaert hardf TriGWriter ;
インスタンス化する必要があり、TriG または Turtle を作成できるクラス
使用例:
$ writer = new TriGWriter ([
" prefixes " => [
" schema " => " http://schema.org/ " ,
" dct " => " http://purl.org/dc/terms/ " ,
" geo " => " http://www.w3.org/2003/01/geo/wgs84_pos# " ,
" rdf " => " http://www.w3.org/1999/02/22-rdf-syntax-ns# " ,
" rdfs " => " http://www.w3.org/2000/01/rdf-schema# "
],
" format " => " n-quads " //Other possible values: n-quads, trig or turtle
]);
$ writer -> addPrefix ( " ex " , " http://example.org/ " );
$ writer -> addTriple ( " schema:Person " , " dct:title " , "" Person " @en " , " http://example.org/#test " );
$ writer -> addTriple ( " schema:Person " , " schema:label " , "" Person " @en " , " http://example.org/#test " );
$ writer -> addTriple ( " ex:1 " , " dct:title " , "" Person1 " @en " , " http://example.org/#test " );
$ writer -> addTriple ( " ex:1 " , " http://www.w3.org/1999/02/22-rdf-syntax-ns#type " , " schema:Person " , " http://example.org/#test " );
$ writer -> addTriple ( " ex:2 " , " dct:title " , "" Person2 " @en " , " http://example.org/#test " );
$ writer -> addTriple ( " schema:Person " , " dct:title " , "" Person " @en " , " http://example.org/#test2 " );
echo $ writer -> end ();
//The method names should speak for themselves:
$ writer = new TriGWriter ([ " prefixes " : [ /* ... */ ]]);
$ writer -> addTriple ( $ subject , $ predicate , $ object , $ graphl );
$ writer -> addTriples ( $ triples );
$ writer -> addPrefix ( $ prefix , $ iri );
$ writer -> addPrefixes ( $ prefixes );
//Creates blank node($predicate and/or $object are optional)
$ writer -> blank ( $ predicate , $ object );
//Creates rdf:list with $elements
$ list = $ writer -> addList ( $ elements );
//Returns the current output it is already able to create and clear the internal memory use (useful for streaming)
$ out .= $ writer -> read ();
//Alternatively, you can listen for new chunks through a callback:
$ writer -> setReadCallback ( function ( $ output ) { echo $ output });
//Call this at the end. The return value will be the full triple output, or the rest of the output such as closing dots and brackets, unless a callback was set.
$ out .= $ writer -> end ();
//OR
$ writer -> end ();
TriG の次に、TriGParser クラスは Turtle、N-Triples、N-Quads、および W3C Team Submission N3 も解析します。
$ parser = new TriGParser ( $ options , $ tripleCallback , $ prefixCallback );
$ parser -> setTripleCallback ( $ function );
$ parser -> setPrefixCallback ( $ function );
$ parser -> parse ( $ input , $ tripleCallback , $ prefixCallback );
$ parser -> parseChunk ( $ input );
$ parser -> end ();
戻り値を使用し、これらをライターに渡します。
use pietercolpaert hardf TriGParser ;
use pietercolpaert hardf TriGWriter ;
$ parser = new TriGParser ([ " format " => " n-quads " ]); //also parser n-triples, n3, turtle and trig. Format is optional
$ writer = new TriGWriter ();
$ triples = $ parser -> parse ( " <A> <B> <C> <G> . " );
$ writer -> addTriples ( $ triples );
echo $ writer -> end ();
コールバックを使用し、これらをライターに渡します。
$ parser = new TriGParser ();
$ writer = new TriGWriter ([ " format " => " trig " ]);
$ parser -> parse ( " <http://A> <https://B> <http://C> <http://G> . <A2> <https://B2> <http://C2> <http://G3> . " , function ( $ e , $ triple ) use ( $ writer ) {
if (! isset ( $ e ) && isset ( $ triple )) {
$ writer -> addTriple ( $ triple );
echo $ writer -> read (); //write out what we have so far
} else if (! isset ( $ triple )) // flags the end of the file
echo $ writer -> end (); //write the end
else
echo " Error occured: " . $ e ;
});
大きなファイルを解析する必要がある場合は、チャンクのみを解析し、それらをすでに処理する必要があります。次のようにして実行できます。
$ writer = new TriGWriter ([ " format " => " n-quads " ]);
$ tripleCallback = function ( $ error , $ triple ) use ( $ writer ) {
if ( isset ( $ error ))
throw $ error ;
else if ( isset ( $ triple )) {
$ writer -> write ();
echo $ writer -> read ();
else if ( isset ( $ error )) {
throw $ error ;
} else {
echo $ writer -> end ();
}
};
$ prefixCallback = function ( $ prefix , $ iri ) use (& $ writer ) {
$ writer -> addPrefix ( $ prefix , $ iri );
};
$ parser = new TriGParser ([ " format " => " trig " ], $ tripleCallback , $ prefixCallback );
$ parser -> parseChunk ( $ chunk );
$ parser -> parseChunk ( $ chunk );
$ parser -> parseChunk ( $ chunk );
$ parser -> end (); //Needs to be called
format
入力フォーマット (大文字と小文字は区別されません)turtle
- カメtrig
- TriGtriple
を含む (例: triple
、 ntriples
、 N-Triples
- N-Triples)quad
が含まれます。たとえば、 quad
、 nquads
、 N-Quads
- N-Quadsn3
含む (例: n3
- N3)blankNodePrefix
(デフォルトはb0_
) 空白のノード名に強制されるプレフィックス、たとえばTriGWriter(["blankNodePrefix" => 'foo'])
_:bar
_:foobar
として解析します。documentIRI
相対 URI を解決するために使用されるベース URI を設定します ( format
が n-triple または n-quads を示す場合は適用されません)lexer
独自の lexer クラスを使用できます。レクサーは次のパブリック メソッドを提供する必要があります。tokenize(string $input, bool $finalize = true): array<array{'subject': string, 'predicate': string, 'object': string, 'graph': string}>
tokenizeChunk(string $input): array<array{'subject': string, 'predicate': string, 'object': string, 'graph': string}>
end(): array<array{'subject': string, 'predicate': string, 'object': string, 'graph': string}>
explicitQuantifiers
- [...] 一部の Turtle ドキュメントと N3 ドキュメントでは、base-IRI に対する相対的な IRI 構文が使用される場合があります (こことここを参照)。
<> <someProperty> "some value" .
このような文書を適切に解析するには、文書ベースの IRI を知っておく必要があります。そうしないと、空の IRI が得られる可能性があります (たとえば、上の例のサブジェクトの場合)。
場合によっては、ベース IRI がドキュメント内でエンコードされることがあります。
@base <http://some.base/iri/> .
<> <someProperty> "some value" .
しかし時々それが欠けていることもあります。このような場合、Turtle 仕様では RFC3986 のセクション 5.1.1 に従う必要があります。この規定では、ベース IRI がドキュメント内にカプセル化されていない場合、それはドキュメント取得 URI (ドキュメントをダウンロードした URL など) であると想定される必要があると規定されています。から、または URL に変換されたファイル パス)。残念ながら、これはhardfパーサーでは推測できないため、 documentIRI
パーサー作成オプションを使用して提供する必要があります。
parser = new TriGParser ([ " documentIRI " => " http://some.base/iri/ " ]);
簡単に言うと、行 X で主語/述語/目的語に遭遇した場合は、 documentIRI
subject/predicate/object on line X can not be parsed without knowing the the document base IRI.(...)
。documentIRI オプションを使用してパーサーを初期化してください。
use pietercolpaert hardf Util ;
特定のトリプル表現を処理するためのいくつかの便利な関数を備えた静的クラス。これは、リテラル、IRI、拡張プレフィックスの作成と評価に役立ちます。
$ bool = isIRI ( $ term );
$ bool = isLiteral ( $ term );
$ bool = isBlank ( $ term );
$ bool = isDefaultGraph ( $ term );
$ bool = inDefaultGraph ( $ triple );
$ value = getLiteralValue ( $ literal );
$ literalType = getLiteralType ( $ literal );
$ lang = getLiteralLanguage ( $ literal );
$ bool = isPrefixedName ( $ term );
$ expanded = expandPrefixedName ( $ prefixedName , $ prefixes );
$ iri = createIRI ( $ iri );
$ literalObject = createLiteral ( $ value , $ modifier = null );
詳細については、https://github.com/RubenVerborgh/N3.js#utility のドキュメントを参照してください。
また、実装例としてbin/
に 2 つのシンプルなツール (バリデーターとトランスレーター) が 2 つ提供されています。たとえば次のようにしてみてください。
curl -H " accept: application/trig " http://fragments.dbpedia.org/2015/en | php bin/validator.php trig
curl -H " accept: application/trig " http://fragments.dbpedia.org/2015/en | php bin/convert.php trig n-triples
2 つのタートル ファイルのパフォーマンスを比較し、PHP の EasyRDF ライブラリ、NodeJS の N3.js ライブラリ、およびhardfを使用して解析しました。結果は次のとおりです。
#トリプル | フレームワーク | 時間(ミリ秒) | メモリ (MB) |
---|---|---|---|
1,866 | opcacheなしのhardf | 27.6 | 0.722 |
1,866 | opcacheを使用したhardf | 24.5 | 0.380 |
1,866 | opcache を使用しない EasyRDF | 5,166.5 | 2.772 |
1,866 | opcache を使用した EasyRDF | 5,176.2 | 2.421 |
1,866 | opcache を使用した ARC2 | 71.9 | 1.966 |
1,866 | N3.js | 24.0 | 28.xxx |
3,896,560 | opcacheなしのhardf | 40,017.7 | 0.722 |
3,896,560 | opcacheを使用したhardf | 33,155.3 | 0.380 |
3,896,560 | N3.js | 7,004.0 | 59.xxx |
3,896,560 | opcache を使用した ARC2 | 203,152.6 | 3,570.808 |
hardfライブラリは Ruben Verborgh と Pieter Colpaert によって著作権が保護されており、MIT ライセンスに基づいてリリースされています。
貢献は大歓迎です。バグ レポートやプル リクエストは常に役に立ちます。より大きな機能を実装する予定がある場合は、まず問題を提出してこれについて話し合うことをお勧めします。