Usando Gufo: prefisso di classe con serializzazione rdflib e xml
-
21-12-2019 - |
Domanda
Vorrei utilizzare il prefisso owl:
nella serializzazione XML della mia ontologia RDF (utilizzando RDFLib versione 4.1.1); Purtroppo sto ancora ottenendo la serializzazione come tag rdf:Description
. Ho esaminato la risposta relativa a vincolante lo spazio dei nomi al grafico a rdflib: namespace prefissi in XML Serialization Ma questo sembra funzionare solo durante la serializzazione utilizzando il formato ns
piuttosto che il formato xml
.
Facciamo più concreti. Sto tentando di ottenere la seguente ontologia (come prelevato da introducendo rdfs e gufo ) In XML come segue:
<!-- OWL Class Definition - Plant Type -->
<owl:Class rdf:about="http://www.linkeddatatools.com/plants#planttype">
<rdfs:label>The plant type</rdfs:label>
<rdfs:comment>The class of all plant types.</rdfs:comment>
</owl:Class>
.
Ecco il codice Python per la costruzione di una cosa del genere, usando rdflib
:
from rdflib.namespace import OWL, RDF, RDFS
from rdflib import Graph, Literal, Namespace, URIRef
# Construct the linked data tools namespace
LDT = Namespace("http://www.linkeddatatools.com/plants#")
# Create the graph
graph = Graph()
# Create the node to add to the Graph
Plant = URIRef(LDT["planttype"])
# Add the OWL data to the graph
graph.add((Plant, RDF.type, OWL.Class))
graph.add((Plant, RDFS.subClassOf, OWL.Thing))
graph.add((Plant, RDFS.label, Literal("The plant type")))
graph.add((Plant, RDFS.comment, Literal("The class of all plant types")))
# Bind the OWL and LDT name spaces
graph.bind("owl", OWL)
graph.bind("ldt", LDT)
print graph.serialize(format='xml')
.
Purtroppo, anche con quelle dichiarazioni di binding, viene stampata la seguente XML:
<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
<rdf:Description rdf:about="http://www.linkeddatatools.com/plants#planttype">
<rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdfs:label>The plant type</rdfs:label>
<rdfs:comment>The class of all plant types</rdfs:comment>
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Class"/>
</rdf:Description>
</rdf:RDF>
.
Certo, questo è ancora un'ontologia e utilizzabile, ma dal momento che abbiamo vari redattori, la prima versione più compatta e leggibile utilizzando il prefisso owl
sarebbe molto preferibile. È possibile farlo in rdflib
senza sovrascrivere il metodo di serializzazione?
Aggiornamento
In risposta ai commenti, riformerò la mia "domanda bonus" come semplice chiarimenti alla mia domanda in generale.
Non una domanda bonus L'argomento qui coinvolge la costruzione dello spazio dei nomi del gufo formattato ontologia che è una stenografia per le specifiche più verbose rdf / xml. Il problema qui è più grande della semplice dichiarazione di un prefisso del namespace per la stenografia per solo lezioni o proprietà, ci sono molte notazioni di stenografia che devono essere affrontate nel codice; Ad esempio, la descrizione owl:Ontology
deve essere aggiunta come buona forma a questa notazione. Spero che RDFLIB abbia un sostegno per la specifica completa della notazione, piuttosto che dover rotolare la mia serializzazione.
Soluzione
Invece di utilizzare il formato xml
, è necessario utilizzare il formato pretty-xml
. È elencato nella documentazione, serializzatori del plugin . Questo ti darà il tipo di uscita che stai cercando. Cioè, useresti una linea come quanto segue per utilizzare il prettyxmlserializer :
print graph.serialize(format='pretty-xml')
.
Per indirizzare la "domanda bonus", è possibile aggiungere una linea come quanto segue per creare l'intestazione di ontologia, quindi serializzare con pretty-xml
ti fornirà la seguente output.
graph.add((URIRef('https://stackoverflow.com/q/24017320/1281433/ontology.owl'), RDF.type, OWL.Ontology ))
.
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
>
<owl:Ontology rdf:about="https://stackoverflow.com/q/24017320/1281433/ontology.owl"/>
<owl:Class rdf:about="http://www.linkeddatatools.com/plants#planttype">
<rdfs:comment>The class of all plant types</rdfs:comment>
<rdfs:subClassOf rdf:resource="http://www.w3.org/2002/07/owl#Thing"/>
<rdfs:label>The plant type</rdfs:label>
</owl:Class>
</rdf:RDF>
.
Aggiunta del triplo x rdf:type owl:Ontology
non è un modo molto centrico molto gufo di dichiarare l'ontologia. Sembra che tu stia cercando qualcosa di più simile all'interfaccia Ontmodel di Jena (che è solo uno strato di comodità sul modello cento-centrico di Jena), o gli Occasi, ma per RDFLIB. Non so se esiste una cosa del genere (non sono un utente rdflib), ma potresti dare un'occhiata a:
- .
- rdflib / gufo-rl : sembra un ragionamento, ma potrebbe avere un po ' dei metodi di cui hai bisogno.
- ispezionando un'ontologia con rdflib < / a>: un articolo del blog con collegamenti alla fonte che potrebbe fare alcuni di ciò che desideri.
- C'è una biblioteca Python per gestire il gufo? : una domanda di overflow stack (ora off-topic, perché la biblioteca / Le richieste degli utensili sono off-topic, ma è una vecchia domanda) in cui la risposta accettata sottolinea che RDFLib è RDF-Centric, non gufo-centrico, ma alcune delle altre risposte potrebbero essere utili, particolari Questo uno , sebbene la maggior parte di quelle fosse obsoleta, anche nel 2011.