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.

È stato utile?

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:

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top