hardf adalah pustaka PHP 7.1+ yang memungkinkan Anda menangani Data Tertaut (RDF). Ini menawarkan:
Baik parser maupun serializer memiliki dukungan streaming .
Perpustakaan ini adalah port N3.js ke PHP
Kami menggunakan representasi rangkap tiga dalam PHP porting dari perpustakaan NodeJS N3.js. Periksa https://github.com/rdfjs/N3.js/tree/v0.10.0#triple-representation untuk informasi lebih lanjut
Kami sengaja berfokus pada kinerja, dan bukan pada keramahan pengembang. Kami kemudian mengimplementasikan representasi rangkap tiga ini menggunakan array asosiatif daripada objek PHP. Jadi, hal yang sama berlaku untuk N3.js, sekarang menjadi sebuah array. Misalnya:
<?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
];
Enkode literal sebagai berikut (mirip dengan N3.js)
' "Tom"@en-gb ' // lowercase language
'" 1 "^^http: //www.w3.org/2001/XMLSchema#integer' // no angular brackets <>
Instal perpustakaan ini menggunakan komposer:
composer require pietercolpaert/ hardf
use pietercolpaert hardf TriGWriter ;
Sebuah kelas yang harus dipakai dan dapat menulis TriG atau Turtle
Contoh penggunaan:
$ 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 ();
Di samping TriG, kelas TriGParser juga mengurai Turtle, N-Triples, N-Quads dan 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 ();
Menggunakan nilai kembalian dan meneruskannya ke penulis:
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 ();
Menggunakan callback dan meneruskannya ke penulis:
$ 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 ;
});
Saat Anda perlu mengurai file besar, Anda hanya perlu mengurai sebagian saja dan sudah memprosesnya. Anda dapat melakukannya sebagai berikut:
$ 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
format input (tidak peka huruf besar-kecil)turtle
- Penyutrig
- TriGtriple
, misalnya triple
, ntriples
, N-Triples
- N-Triplesquad
, misalnya quad
, nquads
, N-Quads
- N-Quadsn3
, misalnya n3
- N3blankNodePrefix
(defaultnya adalah b0_
) awalan yang dipaksakan pada nama node kosong, misalnya TriGWriter(["blankNodePrefix" => 'foo'])
akan menguraikan _:bar
sebagai _:foobar
.documentIRI
menetapkan URI dasar yang digunakan untuk menyelesaikan URI relatif (tidak berlaku jika format
menunjukkan n-triple atau n-quads)lexer
memungkinkan penggunaan kelas lexer sendiri. Lexer harus menyediakan metode publik berikut: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
- [...] Beberapa dokumen Turtle dan N3 mungkin menggunakan sintaksis IRI yang relatif terhadap basisnya (lihat di sini dan di sini), misalnya
<> <someProperty> "some value" .
Untuk mengurai dokumen tersebut dengan benar, basis dokumen IRI harus diketahui. Jika tidak, kita mungkin akan mendapatkan IRI yang kosong (misalnya untuk subjek pada contoh di atas).
Terkadang IRI dasar dikodekan dalam dokumen, misalnya
@base <http://some.base/iri/> .
<> <someProperty> "some value" .
tapi terkadang hilang. Dalam kasus seperti itu, spesifikasi Turtle mengharuskan kita untuk mengikuti bagian 5.1.1 dari RFC3986 yang mengatakan bahwa jika IRI dasar tidak dienkapsulasi dalam dokumen, maka itu harus diasumsikan sebagai URI pengambilan dokumen (misalnya URL tempat Anda mengunduh dokumen dari atau jalur file dikonversi ke URL). Sayangnya hal ini tidak dapat ditebak oleh hardf parser dan harus disediakan oleh Anda menggunakan opsi pembuatan parser documentIRI
, misalnya
parser = new TriGParser ([ " documentIRI " => " http://some.base/iri/ " ]);
Singkat cerita jika Anda menemukan subject/predicate/object on line X can not be parsed without knowing the the document base IRI.(...)
, harap inisialisasi parser dengan opsi documentIRI
.
use pietercolpaert hardf Util ;
Kelas statis dengan beberapa fungsi berguna untuk menangani representasi rangkap tiga spesifik kami. Ini akan membantu Anda membuat dan mengevaluasi literal, IR, dan memperluas prefiks.
$ 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 );
Lihat dokumentasi di https://github.com/RubenVerborgh/N3.js#utility untuk informasi lebih lanjut.
Kami juga menawarkan 2 alat sederhana di bin/
sebagai contoh implementasi: satu validator dan satu penerjemah. Coba misalnya:
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
Kami membandingkan kinerja pada dua file turtle, dan menguraikannya dengan perpustakaan EasyRDF di PHP, perpustakaan N3.js untuk NodeJS dan dengan hardf . Inilah hasilnya:
#tiga kali lipat | kerangka | waktu (md) | memori (MB) |
---|---|---|---|
1.866 | hardf tanpa opcache | 27.6 | 0,722 |
1.866 | hardf dengan opcache | 24.5 | 0,380 |
1.866 | EasyRDF tanpa opcache | 5.166,5 | 2.772 |
1.866 | EasyRDF dengan opcache | 5.176.2 | 2.421 |
1.866 | ARC2 dengan opcache | 71.9 | 1.966 |
1.866 | N3.js | 24.0 | 28.xxx |
3.896.560 | hardf tanpa opcache | 40.017,7 | 0,722 |
3.896.560 | hardf dengan opcache | 33.155,3 | 0,380 |
3.896.560 | N3.js | 7,004.0 | 59.xxx |
3.896.560 | ARC2 dengan opcache | 203.152,6 | 3.570.808 |
Perpustakaan hardf dilindungi hak cipta oleh Ruben Verborgh dan Pieter Colpaert dan dirilis di bawah Lisensi MIT.
Kontribusi dipersilakan, dan laporan bug atau permintaan penarikan selalu membantu. Jika Anda berencana menerapkan fitur yang lebih besar, sebaiknya diskusikan hal ini terlebih dahulu dengan mengajukan masalah.