为什么我的SPARQL查询返回资源的URI而不是其名称? [英] Why does my SPARQL query return the URI of a resource instead of its name?

查看:23
本文介绍了为什么我的SPARQL查询返回资源的URI而不是其名称?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我希望获得我的本体的所有类。这是由Protege创建的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();

}

我期望的结果只是"aqua",但实际上是"http://www.w3.org/2002/07/owl#aqua"。为什么会发生这种情况,我如何取而代之检索该名称?

rdf

推荐答案和OWL中的非匿名资源由Iris标识。您的本体论清楚地说明了http://www.w3.org/2002/07/owl#aqua是类。如果您申请类,应该得到的就是这个类。可能是Protege在显示结果时去掉了http://www.w3.org/2002/07/owl#部件,但结果实际上仍然是IRI。

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

如果您只想获得字符串"aqua"作为结果,您有两个选择。第一种(也是首选的)方法是检索类的rdfs:label(如果它有),它应该是类的字符串名称。如果由于某种原因不起作用,您可以获取URI的字符串值并去掉前缀的字符串值。以下是DBpedia SPARQL端点上这两种方法的示例:

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

SPARQL results (with rdfs:label)

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

SPARQL results (by stripping the prefix)

通常,出于显示目的剥离URI的前缀不是推荐的做法,因为它假定URI具有人类可读的形式。在DBpedia的情况下,这恰好可以工作,但是很多数据集都有带有内部代码的URI,而不是人类可读的名称。因此,如果rdfs:label(显式定义为资源的人类可读表示)可用,您应该尝试并始终使用它。

这篇关于为什么我的SPARQL查询返回资源的URI而不是其名称?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆