为什么我的SPARQL查询返回资源的URI而不是其名称?

我想要得到我所有本体的类。 这是由Protege创build的RDF / XML格式的本体文件的一部分:

<!-- 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"/> 

我写了这个查询,它在Protege中正常工作,但是当我在dotNetRDF中使用它时,它将返回类的完整URI,而不仅仅是它的名字。

  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(); 

}

我预料的结果只是“水”,但实际上是“ http://www.w3.org/2002/07/owl#aqua ”。 为什么会发生这种情况,我怎样才能取回名字呢?

RDF和OWL中的非匿名资源由IRI标识。 你的本体明确地说,http://www.w3.org/2002/07/owl#aqua是类。; 如果你要求上课,那就是你应该得到的。 显示结果时,Protege可能会去除http://www.w3.org/2002/07/owl#部分,但结果实际上仍然是IRI。;

注意:您实际上不应该定义IRI以标准OWL名称空间开头的新类。 您应该定义自己的前缀,通常与本体IRI相关。

如果你只想得到string“aqua”作为结果,你有两个select。 第一种(也是首选的)方法是检索类的rdfs:标签 ,如果它有一个,它应该是类的string名称。 如果由于某些原因不起作用,可以取URI的string值,并去掉前缀的string值。 以下是DBpedia SPARQL端点上两种方法的示例:

 select ?class ?label where { ?class a owl:Class ; rdfs:label ?label filter langMatches(lang(?label),'en') } limit 10 

SPARQL结果(使用rdfs:标签)

 select ?class ?name where { ?class a owl:Class bind(strafter(str(?class),str(dbpedia-owl:)) as ?name) } limit 10 

SPARQL结果(通过剥离前缀)

一般来说,为了显示的目的去除URI的前缀是不被推荐的做法,因为它假定URI具有可读的forms。 在DBPedia正好可以工作的情况下,大量的数据集具有内部代码的URI而不是人类可读的名称。 因此,如果rdfs:label (明确定义为资源的人类可读表示)可用,则应该尝试始终使用该rdfs:label

Interesting Posts