¿Por qué mi consulta SPARQL devuelve el URI de un recurso en lugar de su nombre?

Quiero obtener todas las clases de mi ontología. Esto es parte de mi archivo de ontología en formato RDF / XML creado por Protege:

    

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 list = new List(); TripleStore store = new TripleStore(); Graph mygraph = new Graph(); mygraph.LoadFromFile("D:/msc/search-engine/project/catalogXML.owl"); store.Add(mygraph); string sparqlQuery1 = "PREFIX rdf: " + "PREFIX owl: " + "PREFIX xsd: " + "PREFIX rdfs: " + "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 simplemente “aguamarina”, pero de hecho es ” http://www.w3.org/2002/07/owl#aqua “. ¿Por qué sucede esto y cómo puedo recuperar el nombre?

Los IRI identifican los recursos no anónimos en RDF y OWL. Su ontología dice claramente que http://www.w3.org/2002/07/owl#aqua es clase. Si pide la clase, eso es lo que debe obtener. Es posible 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. Debería definir su propio prefijo, normalmente relacionado con el IRI de ontología.

Si solo desea obtener la cadena “aqua” como resultado, tiene dos opciones. El primer (y preferido) enfoque 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 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 (eliminando el prefijo)

Quitar el prefijo de un URI para fines de visualización es, en general, no una práctica recomendada, ya que supone que el URI tiene una forma legible por humanos. En el caso de DBPedia que funciona, pero muchos datasets tienen URI con códigos internos en lugar de nombres legibles por humanos. Entonces, si la rdfs:label (que está explícitamente definida como la representación legible por humanos del recurso) está disponible, debe intentar y siempre usar eso.