ejemplos - ¿Cómo acceder a los documentos OWL usando XPath en Java?
xpath expression java (3)
Estoy teniendo un documento OWL en forma de un archivo XML. Quiero extraer elementos de este documento. Mi código funciona para documentos XML simples, pero no funciona con documentos OWL XML.
En realidad estaba buscando obtener este elemento: /rdf:RDF/owl:Ontology/rdfs:label
, para lo cual hice esto:
DocumentBuilder builder = builderfactory.newDocumentBuilder();
Document xmlDocument = builder.parse(
new File(XpathMain.class.getResource("person.xml").getFile()));
XPathFactory factory = javax.xml.xpath.XPathFactory.newInstance();
XPath xPath = factory.newXPath();
XPathExpression xPathExpression = xPath.compile("/rdf:RDF/owl:Ontology/rdfs:label/text()");
String nameOfTheBook = xPathExpression.evaluate(xmlDocument,XPathConstants.STRING).toString();
También intenté extraer solo el elemento rdfs:label
esta manera:
XPathExpression xPathExpression = xPath.compile("//rdfs:label");
NodeList nodes = (NodeList) xPathExpression.evaluate(xmlDocument, XPathConstants.NODESET);
Pero esta lista de nodos está vacía.
Por favor, hágame saber dónde me estoy equivocando. Estoy usando Java XPath API.
como xpath no conoce los espacios de nombres que está usando. Intenta usar:
"/*[local-name()=''RDF'']/*[local-name()=''Ontology'']/*[local-name()=''label'']/text()"
el nombre local ignorará los espacios de nombres y funcionará (para la primera instancia de esto que encuentre)
No consulte RDF (o OWL) con XPath
Ya hay una respuesta aceptada, pero quería profundizar en el comentario de @Michael sobre la pregunta. Es una muy mala idea tratar de trabajar con RDF como XML (y, por lo tanto, la serialización RDF de una ontología OWL), y el motivo es muy simple: el mismo gráfico RDF se puede serializar como muchos documentos XML diferentes. En la pregunta, todo lo que se solicita es la rdfs:label
de un elemento owl:Ontology
, ¿cuánto podría salir mal? Bueno, aquí hay dos serializaciones de la ontología.
El primero es bastante legible, y fue generado por la API OWL cuando guardé la ontología usando el editor de ontologías Protégé. La consulta en la respuesta aceptada funcionaría en esto, creo.
<rdf:RDF xmlns="http://www.example.com/labelledOnt#"
xml:base="http://www.example.com/labelledOnt"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<owl:Ontology rdf:about="http://www.example.com/labelledOnt">
<rdfs:label>Here is a label on the Ontology.</rdfs:label>
</owl:Ontology>
</rdf:RDF>
Aquí está el mismo gráfico RDF que usa menos de las características sofisticadas disponibles en la codificación RDF / XML. Este es el mismo gráfico RDF , y por lo tanto la misma ontología OWL. Sin embargo, no hay ningún elemento owl:Ontology
XML aquí, y la consulta XPath fallará.
<rdf:RDF
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:owl="http://www.w3.org/2002/07/owl#"
xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
xmlns="http://www.example.com/labelledOnt#"
xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#" >
<rdf:Description rdf:about="http://www.example.com/labelledOnt">
<rdf:type rdf:resource="http://www.w3.org/2002/07/owl#Ontology"/>
<rdfs:label>Here is a label on the Ontology.</rdfs:label>
</rdf:Description>
</rdf:RDF>
No se puede consultar de manera confiable un gráfico RDF en la serialización RDF / XML mediante el uso de técnicas típicas de procesamiento XML.
Consulta RDF con SPARQL
Bueno, si no podemos consultar confiablemente RDF con XPath, ¿qué se supone que debemos usar? El lenguaje de consulta estándar para RDF es SPARQL . RDF es una representación basada en gráficos, y las consultas SPARQL incluyen patrones de gráficos que pueden coincidir con un gráfico.
En este caso, el patrón que queremos unir en un gráfico consiste en dos triples. Un triple es una 3-tupla de la forma [subject,predicate,object]
. Ambos triples tienen el mismo tema.
- El primer triple dice que el sujeto es de tipo
owl:Ontology
. La relación "es de tipo" esrdf:type
, por lo que el primer triple es[?something,rdf:type,owl:Ontology]
. - El segundo triple dice que el sujeto (ahora conocido como ontología) tiene una
rdfs:label
ese es el valor que nos interesa. El triple correspondiente es[?something,rdfs:label,?label]
.
En SPARQL, después de definir los prefijos necesarios, podemos escribir la siguiente consulta.
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
SELECT ?label WHERE {
?ontology a owl:Ontology ;
rdfs:label ?label .
}
(Tenga en cuenta que debido a que rdf:type
es tan común, SPARQL incluye a
abreviatura para él. La notación s p1 o1; p2 o2 .
Es solo una abreviatura para el patrón de dos triples s p1 o1 . s p2 o2 .
.)
Puede ejecutar consultas SPARQL contra su modelo en Jena ya sea programáticamente, o usando las herramientas de línea de comando. Si lo hace mediante programación, es bastante fácil obtener los resultados. Para confirmar que esta consulta obtiene el valor que nos interesa, podemos usar la línea de comando de Jena para arq
para probarla.
$ arq --data labelledOnt.owl --query getLabel.sparql
--------------------------------------
| label |
======================================
| "Here is a label on the Ontology." |
--------------------------------------
Podrías usar espacios de nombres en la consulta si implementa javax.xml.namespace.NamespaceContext
por ti mismo. Por favor, eche un vistazo a esta respuesta https://.com/a/5466030/1443529 , esto explica cómo hacerlo.