sweetrdf/rdf-helpers
sweetrdf/rdf-helpers provides helper classes to implement sweetrdf/rdfInterface: DefaultGraph, a GenericQuadIterator for arrays/quads/iterators, N-Triples serialization utilities, and an RdfNamespace implementation.
Installation:
composer require sweetrdf/rdf-helpers
Ensure your project uses rdfInterface (v1 or v2) as a dependency.
First Use Case: Serialize an RDF literal to NTriples format:
use sweetrdf\rdfHelpers\NtriplesUtil;
$util = new NtriplesUtil();
$serialized = $util->serializeLiteral("example", "en");
// Output: "example"@en
Key Classes to Explore:
DefaultGraph for default graph implementations.GenericQuadIterator for iterating over RDF quads.RdfNamespace for managing RDF namespaces.Use RdfNamespace to register and resolve IRIs:
$ns = new RdfNamespace();
$ns->add('ex', 'http://example.org/');
$iri = $ns->resolve('ex:resource');
// Returns: "http://example.org/resource"
Iterate over RDF quads (subject, predicate, object, graph) using GenericQuadIterator:
use sweetrdf\rdfHelpers\GenericQuadIterator;
$quads = [
['subj', 'pred', 'obj', 'graph'],
['subj2', 'pred2', 'obj2', 'graph2']
];
$iterator = new GenericQuadIterator($quads);
foreach ($iterator as $quad) {
echo $quad->getSubject(); // Access quad components
}
Convert RDF terms to NTriples format:
$util = new NtriplesUtil();
$ntriple = $util->serialize([
'subject' => 'ex:subj',
'predicate' => 'ex:pred',
'object' => 'object value',
'graph' => 'ex:graph'
]);
// Output: <http://example.org/subj> <http://example.org/pred> "object value" .
Filter and manipulate term iterators:
$terms = ['term1', 'term2', 'term3'];
$iterator = new GenericTermIterator($terms);
// Filter terms
$filtered = $iterator->skip(['term2']);
$filtered->getValues(); // ['term1', 'term3']
// Check for term existence
$iterator->contains('term1'); // true
Service Provider Binding:
Bind RdfNamespace or NtriplesUtil in a service provider for dependency injection:
$this->app->bind(RdfNamespace::class, function () {
$ns = new RdfNamespace();
$ns->add('app', config('app.url'));
return $ns;
});
Query Builder Extensions: Extend Laravel’s query builder to work with RDF quads:
// Example: Custom RDF query builder
class RdfQueryBuilder extends Builder {
public function withQuadIterator(GenericQuadIterator $iterator) {
// Process quads...
}
}
API Responses: Serialize RDF data for API responses:
return response()->json([
'data' => $util->serialize($rdfData)
]);
Iterator Validity:
GenericQuadIterator::current() returns null if the iterator is invalid (e.g., after next() on an exhausted iterator). Always check for null:
if ($iterator->valid()) {
$quad = $iterator->current();
}
Namespace Collisions:
RdfNamespace::add() throws an exception if the prefix already exists. Use has() to check first:
if (!$ns->has('ex')) {
$ns->add('ex', 'http://example.org/');
}
NTriples Escaping:
NtriplesUtil handles escaping automatically, but manual input (e.g., user-provided strings) may require pre-escaping to avoid malformed output.
Term Comparison:
Use TermIteratorInterface::contains() for debugging term presence:
if (!$iterator->contains($expectedTerm)) {
throw new \RuntimeException("Term not found in iterator");
}
Quad Validation: Validate quads before serialization:
$quad = $iterator->current();
if (!$quad->getSubject() || !$quad->getPredicate()) {
throw new \InvalidArgumentException("Invalid quad");
}
Custom Iterators:
Extend GenericQuadIterator to support custom data sources (e.g., database queries):
class DatabaseQuadIterator extends GenericQuadIterator {
public function __construct(Connection $connection) {
$this->connection = $connection;
}
public function current() {
return $this->connection->fetchQuad();
}
}
Namespace Strategies:
Override RdfNamespace::resolve() for custom IRI resolution logic (e.g., dynamic prefixes):
class DynamicRdfNamespace extends RdfNamespace {
public function resolve($prefix) {
if ($prefix === 'dynamic') {
return 'http://dynamic.example.com/' . time();
}
return parent::resolve($prefix);
}
}
Serialization Hooks:
Extend NtriplesUtil for custom serialization rules:
class CustomNtriplesUtil extends NtriplesUtil {
public function serializeLiteral($value, $lang = null) {
if ($lang === 'custom') {
return '"' . $value . '"^^<http://example.org/custom>';
}
return parent::serializeLiteral($value, $lang);
}
}
How can I help you explore Laravel packages today?