URIs in RDF-Daten ersetzen

Gibt es ein einfaches Tool um URIs in RDF-Daten zu ersetzen? Beispielsweise möchte ich wenn ich RDF-Daten bekomme alle Vorkommen von http://purl.org/dc/elements/1.1/title und http://purl.org/dc/terms/title auf eine der beiden URIs mappen, ohne mich mit Inference beschäftigen zu müssen. Was worauf gemappt wird, sollte per Datei konfigurierbar sein, möglichst auch per pattern, also alle URIs die mit http://purl.org/dc/elements/1.1/ beginnen bekommen stattdessen http://purl.org/dc/terms/ davor.

Als Konfiguration reicht eigentlich eine Liste von Triplen mit einem der Prädikate
owl:sameAs, owl:equivalentProperty, rdfs:subClassOf, rdfs:subPropertyOf, skos:exactMatch, skos:broadMatch… und eine spezielle Property zum mappen von URI-Namesräumen, ??:sameUriSpace?

Ein Skript das sowas macht ist schnell erstellt, ich wollte aber lieber fragen, ob es nicht schon sowas gibt, ehe das Rad neu erfunden wird. Oder was nutzt ihr zur Konsolidierung von RDF-Daten mit Ontologien, die eigene Klassen und Properties definieren, auf bekanntere Ontologien?

Es ist ewig lange her, dass ich mit RDF-Daten gearbeitet habe. Aber ich erinnerte mich, dass GraphDB interessante Features hat und hab deshalb nachgeguckt und das hier gefunden: Ontology Mapping with owl:sameAs Property — GraphDB SE 9.11.0 documentation

Ich würde sowas wahrscheinlich mit rdflib und SPARQL update angehen, siehe etwa Querying with SPARQL — rdflib 7.1.0a0 documentation Kommt aber eigentlich auf den konkreten Anwendungsfall und bereits aufgesetze Verarbeitungsprozeese an, in die das integriert werden muss. Vielleicht hast du ja mehr Details…?

Danke für die Hinweise. Ich wollte aber nicht mit Kanonen auf Spatzen schießen sondern reines Suchen- und Ersetzen von URIs in einer NTriples-Datei. Wahrscheinlich reicht ein kurzes Skript in Perl oder Phython.

Das Skript ist doch etwas umfangreicher, da es gleich ein allgemeines Werkzeug geworden ist. Mit rdffilter lassen sich RDF-Tripel filtern und ersetzen.

Die Filter und Ersetzungsregeln sind jeweils kurze Node-Skripte z.B. um sicherzustellen, dass alle IRIs HTTP oder HTTPS-URLs sind:

const ok = node => node.termType === "NamedNode" ? /^(https?)/.test(node.id) : true

export default ({subject, predicate, object}) => {
  return ok(subject) && ok(predicate) && ok(object)
}

Ein weiteres Beispiel aus der Praxis ist das Rausfiltern von relative IRIs, die in zu importierenden Daten eigentlich nicht vorkommen sollten. Weitere Beispiele werden hier gesammelt und zusammen mit dem Skript publiziert.

1 Like