hardf เป็นไลบรารี่ PHP 7.1+ ที่ให้คุณจัดการ Linked Data (RDF) มันมี:
ทั้ง parser ในฐานะซีเรียลไลเซอร์มีการรองรับ การสตรีม
ไลบรารีนี้เป็นพอร์ตของ N3.js ไปยัง PHP
เราใช้การแสดงแบบสามเท่าใน PHP ที่ย้ายจากไลบรารี NodeJS N3.js ตรวจสอบ 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 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
- ไตรจีtriple
เช่น triple
, ntriples
, N-Triples
- N-Triplesquad
เช่น quad
, nquads
, N-Quads
- N-Quadsn3
เช่น n3
- N3blankNodePrefix
(ค่าเริ่มต้นคือ b0_
) คำนำหน้าบังคับกับชื่อโหนดว่าง เช่น TriGWriter(["blankNodePrefix" => 'foo'])
จะแยกวิเคราะห์ _:bar
เป็น _:foobar
documentIRI
ตั้งค่า URI ฐานที่ใช้ในการแก้ไข URI ที่เกี่ยวข้อง (ใช้ไม่ได้หาก format
ชี้ว่า n-triples หรือ n-quads)lexer
อนุญาตให้ใช้คลาส 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 บางฉบับอาจใช้ไวยากรณ์ IRI ที่สัมพันธ์กับฐาน (ดู ที่นี่ และ ที่นี่ ) เช่น
<> <someProperty> "some value" .
เพื่อแยกวิเคราะห์เอกสารดังกล่าวอย่างเหมาะสม จะต้องรู้จัก IRI ของฐานเอกสาร มิฉะนั้นเราอาจพบว่า IRI ว่างเปล่า (เช่น สำหรับหัวเรื่องในตัวอย่างด้านบน)
บางครั้ง IRI พื้นฐานจะถูกเข้ารหัสในเอกสาร เช่น
@base <http://some.base/iri/> .
<> <someProperty> "some value" .
แต่บางครั้งก็หายไป ในกรณีเช่นนี้ ข้อกำหนดของ Turtle กำหนดให้เราต้องปฏิบัติตามส่วนที่ 5.1.1 ของ RFC3986 ซึ่งระบุว่าหาก IRI พื้นฐานไม่ได้ถูกห่อหุ้มไว้ในเอกสาร ก็ควรจะถือว่าเป็น URI การดึงเอกสาร (เช่น URL ที่คุณดาวน์โหลดเอกสาร จากหรือเส้นทางไฟล์ที่แปลงเป็น URL) น่าเสียดายที่ hardf parser ไม่สามารถเดาได้ และคุณต้องจัดเตรียมไว้โดยใช้ตัวเลือกการสร้าง documentIRI
parser เช่น
parser = new TriGParser ([ " documentIRI " => " http://some.base/iri/ " ]);
เรื่องสั้นเรื่องยาว หากคุณพบ subject/predicate/object on line X can not be parsed without knowing the the document base IRI.(...)
โปรดเริ่มต้น parser ด้วยตัวเลือก documentIRI
use pietercolpaert hardf Util ;
คลาสแบบสแตติกที่มีฟังก์ชันที่เป็นประโยชน์สองสามรายการสำหรับจัดการการแสดงค่า Triple ที่เฉพาะเจาะจงของเรา มันจะช่วยคุณในการสร้างและประเมินค่าตัวอักษร 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สำหรับข้อมูลเพิ่มเติม
นอกจากนี้เรายังมีเครื่องมือง่ายๆ 2 รายการใน bin/
เป็นตัวอย่างการใช้งาน: เครื่องมือตรวจสอบหนึ่งตัวและตัวแปลหนึ่งตัว ลองตัวอย่าง:
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
เราเปรียบเทียบประสิทธิภาพของไฟล์เต่าสองไฟล์ และแยกวิเคราะห์กับไลบรารี EasyRDF ใน PHP, ไลบรารี N3.js สำหรับ NodeJS และกับ hardf นี่คือผลลัพธ์:
#สามเท่า | กรอบ | เวลา (มิลลิวินาที) | หน่วยความจำ (เมกะไบต์) |
---|---|---|---|
1,866 | hardf โดยไม่มี opcache | 27.6 | 0.722 |
1,866 | hardf ด้วย opcache | 24.5 | 0.380 |
1,866 | EasyRDF โดยไม่มี opcache | 5,166.5 | 2.772 |
1,866 | EasyRDF พร้อม opcache | 5,176.2 | 2.421 |
1,866 | ARC2 พร้อม opcache | 71.9 | 1.966 |
1,866 | N3.js | 24.0 | 28.xxx |
3,896,560 | hardf โดยไม่มี opcache | 40,017.7 | 0.722 |
3,896,560 | hardf ด้วย opcache | 33,155.3 | 0.380 |
3,896,560 | N3.js | 7,004.0 | 59.xxx |
3,896,560 | ARC2 พร้อม opcache | 203,152.6 | 3,570.808 |
ห้องสมุด hardf เป็นลิขสิทธิ์ของ Ruben Verborgh และ Pieter Colpaert และเผยแพร่ภายใต้ใบอนุญาต MIT
ยินดีให้การสนับสนุน และรายงานข้อผิดพลาดหรือคำขอดึงข้อมูลจะเป็นประโยชน์เสมอ หากคุณวางแผนที่จะใช้คุณลักษณะที่ใหญ่ขึ้น วิธีที่ดีที่สุดคือพูดคุยเรื่องนี้ก่อนโดยการยื่นเรื่อง