sweetrdf / term-templates
A set of Term templates for the rdfInterface
Installs: 4 842
Dependents: 3
Suggesters: 0
Security: 0
Stars: 0
Watchers: 3
Forks: 0
Open Issues: 0
Requires
- php: >=8.0
- sweetrdf/rdf-interface: ^2
- zozlak/rdf-constants: ^1
Requires (Dev)
- phpstan/phpstan: ^1
- phpunit/phpunit: ^10
- sweetrdf/simple-rdf: ^2
README
Provides:
- A set of term templates allowing to match desired RDF named nodes, literals and quads.
To be used mainly as
rdfInterface\Dataset
methods$filter
parameter. - A convenient methods for extracting single terms and/or their values from
rdfInterface\Dataset
.
Quad-matching classes
termTemplates\QuadTemplate
termTemplates\PredicateTemplate
- atermTemplates\QuadTemplate
variant skipping the subject (convenient for filtering therdfInterface\DatasetNode
)
Term-matching classes
(all classes in the termTemplate
namespace)
[1] Supports filtering also by literal's lang (using == and any operators) and datatype (only using == operator).
[2] Supports both strict and non-strict mode. In the strict mode comparison with literals with non-numeric datatype returns false
no matter their value.
Other classes
termTemplates\NotTemplate
- negates the result of theequals()
operation on a givenrdfInterface\TermCompare
object.termTemplates\AnyOfTemplate
- matches terms being equal to any of given list ofrdfInterface\TermCompare
objects. as singlerdfInterface\Term
, single value, array ofrdfInterface\Term
or array of values.
Installation
- Obtain the Composer
- Run
composer require sweetrdf/term-templates
Automatically generated documentation
https://sweetrdf.github.io/termTemplates/namespaces/termtemplates.html
It's very incomplete but better than nothing.
RdfInterface documentation is included which explains the most important design decisions.
Usage examples
Remarks:
- The comparison with term templates isn't symmetric!
You should always call
$termTemplate->equals($termToBeCompared)
and never$termToBeCompared->equals($termTemplate)
. The latter one will always return false. - See also here for examples of using term templates in conjuction with an RDF datasets.
- To run this examples an RDF terms factory is needed. Here we will use the one from the quickRdf library.
You can install it with
composer require sweetrdf/quick-rdf
. - In the examples below the comparison operators are specified by stating corresponding
termTemplates\ValueTemplate
class constants but you can also use corresponding constants values as listed in the table above (e.g.>=
orregex
). - If you are tired with the long code, define class aliases, e.g.
use termTemplates\QuadTemplate as QT;
,use termTemplates\ValueTemplate as VT;
, etc.
String values comparison
$df = new quickRdf\DataFactory(); $literals = [ $df::literal('Lorem ipsum', 'lat'), $df::namedNode('http://ipsum.dolor/sit#amet'), $df::literal('foo bar'), ]; // find all terms containing 'ipsum' // true, true, false $tmplt = new termTemplates\ValueTemplate('ipsum', termTemplates\ValueTemplate::CONTAINS); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find all literals containing 'ipsum' // true, false, false $tmplt = new termTemplates\LiteralTemplate('ipsum', termTemplates\ValueTemplate::CONTAINS); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find all named nodes containing 'ipsum' // false, true, false $tmplt = new termTemplates\NamedNodeTemplate('ipsum', termTemplates\ValueTemplate::CONTAINS); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find all literals in latin // true, false, false $tmplt = new termTemplates\LiteralTemplate(lang: 'lat'); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find all terms with string value lower than 'http' // true, false, true $tmplt = new termTemplates\LiteralTemplate('http', termTemplates\ValueTemplate::LOWER); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find all terms matching a 'Lorem|foo' regular expression // true, false, true $tmplt = new termTemplates\ValueTemplate('/Lorem|foo/', termTemplates\ValueTemplate::REGEX); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // ValueTemplate, NamedNodeTemplate and LiteralTemplate can be passed multiple values // In such a case condition needs to be fulfilled on any value // true, true, false $tmplt = new termTemplates\ValueTemplate(['Lorem ipsum', 'http://ipsum.dolor/sit#amet']); print_r(array_map(fn($x) => $tmplt->equals($x), $literals));
Numeric values comparison
$df = new quickRdf\DataFactory(); $literals = [ $df->literal('2'), $df->literal(3, null, 'http://www.w3.org/2001/XMLSchema#int'), $df->literal('1foo'), $df->literal('2', null, 'http://www.w3.org/2001/XMLSchema#int'), $df->namedNode('http://ipsum.dolor/sit#amet'), ]; // find terms with a value of 2 // true, false, false, true, false $tmplt = new termTemplates\NumericTemplate(2); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find terms with a value of 2 and enforce an RDF numeric type // false, false, false, true, false $tmplt = new termTemplates\NumericTemplate(2, strict: true); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find terms with a value greate or equal than 3 // false, true, false, false, false $tmplt = new termTemplates\NumericTemplate(3, termTemplates\ValueTemplate::GREATER_EQUAL); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find all terms with numeric values // true, true, false, true, false $tmplt = new termTemplates\NumericTemplate(matchMode: termTemplates\ValueTemplate::ANY); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find all numeric terms with values not equal 2 // false, true, false, false, false $tmplt = new termTemplates\NumericTemplate(2, termTemplates\ValueTemplate::NOT_EQUALS); print_r(array_map(fn($x) => $tmplt->equals($x), $literals));
Negation and aggregation
$literals = [ $df->literal('2'), $df->literal(3, null, 'http://www.w3.org/2001/XMLSchema#int'), $df->literal('1foo'), $df->literal('2', null, 'http://www.w3.org/2001/XMLSchema#int'), $df->namedNode('http://ipsum.dolor/sit#amet'), ]; // find all terms which value is not equal 2 (also non-numeric and non-literal ones) // false, true, true, false, true $tmplt = new termTemplates\NumericTemplate(2); $tmplt = new termTemplates\NotTemplate($tmplt); print_r(array_map(fn($x) => $tmplt->equals($x), $literals)); // find all terms with numeric value of 2 and all named nodes // true, false, false, true, true $tmplt = new termTemplates\AnyOfTemplate([ new termTemplates\NumericTemplate(2), new termTemplates\NamedNodeTemplate() ]); print_r(array_map(fn($x) => $tmplt->equals($x), $literals));
Quads comparison
$df = new quickRdf\DataFactory(); // find all quads with a literal value containing 'foo' $tmplt = new termTemplates\QuadTemplate(object: new termTemplates\LiteralTemplate('foo', termTemplates\ValueTemplate::CONTAINS)); // find all quads with a given subject within a given graph $tmplt = new termTemplates\QuadTemplate( subject: 'http://desired/subject', graph: 'http://desired/graph' ); // find all quads with a given predicate $tmplt = new termTemplates\QuadTemplate(predicate: 'http://desired/predicate'); //or $tmplt = new termTemplates\PredicateTemplate('http://desired/predicate'); // both QuadTemplate and PredicateTemplate support negation, e.g. // find all quads with subject different than 'http://unwanted/subject' $tmplt = new termTemplates\QuadTemplate('http://desired/predicate', negate: true);