¿Por qué mi consulta SPARQL devuelve el URI de un recurso en lugar de su nombre?
dotnetrdf (1)
Quiero obtener todas las clases de mi ontología. Esta es una parte de mi archivo de ontología en formato RDF / XML creado por Protege:
<!-- http://www.w3.org/2002/07/owl#aqua -->
<Class rdf:about="&owl;aqua"/>
<!-- http://www.w3.org/2002/07/owl#varioPerfect -->
<Class rdf:about="&owl;varioPerfect"/>
Escribí esta consulta, que funciona correctamente en Protege, pero cuando la uso en dotNetRDF, devuelve el URI completo de la clase en lugar de solo su nombre.
public string[] ontologysearch()
{
List<string> list = new List<string>();
TripleStore store = new TripleStore();
Graph mygraph = new Graph();
mygraph.LoadFromFile("D:/msc/search-engine/project/catalogXML.owl");
store.Add(mygraph);
string sparqlQuery1 = "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"
+ "PREFIX owl: <http://www.w3.org/2002/07/owl#>"
+ "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>"
+ "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>"
+ "SELECT distinct ?cls1"
+ " WHERE{"
+ " ?cls1 a owl:Class .}";
SparqlQueryParser sparqlParser = new SparqlQueryParser();
SparqlQuery query = sparqlParser.ParseFromString(sparqlQuery1);
InMemoryDataset ds = new InMemoryDataset(mygraph);
//Get the Query processor
ISparqlQueryProcessor processor = new LeviathanQueryProcessor(ds);
Object results = processor.ProcessQuery(query);
if (results is SparqlResultSet)
{
SparqlResultSet r = results as SparqlResultSet;
foreach (SparqlResult res in r)
{
list.Add(res["cls1"].ToString());
}
}
return list.ToArray();
}
El resultado que esperaba era solo "aqua" pero de hecho es " http://www.w3.org/2002/07/owl#aqua ". ¿Por qué sucede esto y cómo puedo recuperar el nombre?
Los recursos no anónimos en RDF y OWL se identifican mediante IRI. Su ontología dice claramente que http://www.w3.org/2002/07/owl#aqua es clase. Si pides la clase, eso es lo que debes obtener. Puede ser que Protege elimine la parte http://www.w3.org/2002/07/owl# cuando muestra el resultado, pero el resultado sigue siendo el IRI.
Nota: realmente no debería definir nuevas clases cuyos IRI comiencen con el espacio de nombres OWL estándar. Debe definir su propio prefijo, generalmente relacionado con el IRI de ontología.
Si solo desea obtener la cadena "aqua" como resultado, tiene dos opciones. El primer enfoque (y preferido) es recuperar la etiqueta rdfs: de la clase, si tiene una, que debería ser el nombre de la cadena de la clase. Si por alguna razón eso no funciona, puede tomar el valor de cadena del URI y quitar el valor de cadena del prefijo. Aquí hay ejemplos de ambos enfoques en el punto final DBpedia SPARQL:
select ?class ?label where {
?class a owl:Class ; rdfs:label ?label
filter langMatches(lang(?label),''en'')
}
limit 10
Resultados de SPARQL (con rdfs: etiqueta)
select ?class ?name where {
?class a owl:Class
bind(strafter(str(?class),str(dbpedia-owl:)) as ?name)
}
limit 10
Resultados de SPARQL (quitando el prefijo)
Eliminar el prefijo de un URI para fines de visualización no es, en general, una práctica recomendada, ya que se supone que el URI tiene una forma legible para los humanos.
En el caso de DBPedia, eso funciona, pero muchos conjuntos de datos tienen URI con códigos internos en lugar de nombres legibles por humanos.
Por lo tanto, si la
rdfs:label
(que se define explícitamente como la representación legible del recurso por el ser humano) está disponible, debe intentar usarla siempre.