hardf 연결된 데이터(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 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-트리플)quad
포함(예: quad
, nquads
, N-Quads
- N-Quads)n3
포함(예: n3
- N3)blankNodePrefix
(기본값은 b0_
) 접두사가 빈 노드 이름에 강제 적용됩니다. 예를 들어 TriGWriter(["blankNodePrefix" => 'foo'])
_:bar
_:foobar
로 구문 분석합니다.documentIRI
상대 URI를 확인하는 데 사용되는 기본 URI를 설정합니다. format
n-트리플 또는 n-쿼드를 나타내는 경우 적용할 수 없습니다.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에 상대적인 IRI 구문을 사용할 수 있습니다(여기 및 여기 참조). 예:
<> <someProperty> "some value" .
그러한 문서를 적절하게 구문 분석하려면 문서 기반 IRI를 알아야 합니다. 그렇지 않으면 빈 IRI로 끝날 수도 있습니다(예: 위 예의 주제에 대해).
때로는 기본 IRI가 문서에 인코딩됩니다.
@base <http://some.base/iri/> .
<> <someProperty> "some value" .
하지만 때로는 누락됩니다. 이러한 경우 Turtle 사양에서는 기본 IRI가 문서에 캡슐화되지 않은 경우 문서 검색 URI(예: 문서를 다운로드한 URL)로 가정해야 한다고 명시하는 RFC3986의 섹션 5.1.1을 따라야 합니다. 또는 URL로 변환된 파일 경로). 불행하게도 이것은 hardf 파서로 추측할 수 없으며 documentIRI
파서 생성 옵션을 사용하여 제공해야 합니다. 예:
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.(...)
오류가 발생합니다. 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개의 간단한 도구(검증기 하나와 번역기 하나)를 제공합니다. 예를 들면 다음과 같습니다.
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
우리는 두 개의 거북이 파일의 성능을 비교하고 이를 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 라이선스에 따라 배포됩니다.
기여를 환영하며, 버그 보고서나 끌어오기 요청이 항상 도움이 됩니다. 더 큰 기능을 구현하려는 경우 먼저 문제를 제출하여 이에 대해 논의하는 것이 가장 좋습니다.