当前位置: 首页 > 知识库问答 >
问题:

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

鲜于裕
2023-03-14

我想获得我的本体的所有类。这是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”。为什么会发生这种情况,我如何取回名称呢?

共有1个答案

董同
2023-03-14

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 SPARQLendpoint上这两种方法的示例:

select ?class ?label where {
  ?class a owl:Class ; rdfs:label ?label
  filter langMatches(lang(?label),'en')
}
limit 10
sql prettyprint-override">select ?class ?name where {
  ?class a owl:Class
  bind(strafter(str(?class),str(dbpedia-owl:)) as ?name)
}
limit 10

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

 类似资料:
  • 问题内容: 很难说出这里的要求。这个问题是模棱两可的,模糊的,不完整的,过于广泛的或修辞性的,不能以目前的形式合理地回答。如需帮助澄清此问题以便可以重新打开, 请访问帮助中心。 7年前关闭。 嗨,我试图发现如何解决我的查询以返回正确的结果。这是我的查询: 查询应返回一个小数点后一位数字(3.5)。在PhpMyAdmin中进行测试时,它工作正常,但是在我的网站上,它返回。 数据库连接一切正常。 问题

  • 问题内容: 我有一堆应聘者,他们有一些或多个工作,每个人都在公司工作,并且使用了一些技能。 坏的ascii艺术如下: 这是我的数据库: 。 。 。 。 这是我对查询的尝试(请注意,我打算将通配符更改为字段名称;我只是想使某些功能生效): HediSql说 查询出了什么问题?我希望从不良的ascii艺术中可以清楚地知道我要达到的目标。 (此外,它对我连接表的顺序是否有任何速度差异?我将担心新的MyS

  • 我的代码: 当我尝试运行这样的东西时: 我得到了: 但为什么? 我的主要目标是将返回承诺的中的token转换为一个变量。然后才预形成一些动作。

  • 问题内容: 我的代码: 当我尝试运行这样的东西时: 我越来越: 但为什么? 我的主要目标是将令牌(从令牌中返回承诺)转换为变量。然后才执行一些操作。 问题答案: 只要其结果尚未解决,promise将始终记录未决。无论promise状态如何(已解决或仍处于待处理状态),您都必须调用promise来捕获结果: 这是为什么? 承诺只是向前的方向;您只能解决一次。a的解析值传递给其或方法。 根据Promi

  • 问题内容: 快速版本 基本上,我正在更新hibernate表,后续查询正在加载陈旧的值。 详细版本 hibernate(3.3.1.GA)和EhCache(2.4.2)。 包含页面的持久对象,我将页面添加到本书的中间。我正在使用Databinder / Wicket,尽管我认为这并不相关。 适用的字段/方法是: 最终结果是,有一个新页面添加到列表中,并且数据库也进行了相应更新,我已经在我的数据存储