【问题标题】:Simple SPARQL query to retrieve OWL class individuals with certain values用于检索具有特定值的 OWL 类个体的简单 SPARQL 查询
【发布时间】:2014-04-27 17:13:16
【问题描述】:

我有以下两个人的 OWL 课程:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE rdf:RDF [
  <!ENTITY owl "http://www.w3.org/2002/07/owl#">
  <!ENTITY rdf "http://www.w3.org/1999/02/22-rdf-syntax-ns#">
  <!ENTITY rdfs "http://www.w3.org/2000/01/rdf-schema#">
  <!ENTITY xsd "http://www.w3.org/2001/XMLSchema#">
]>

<rdf:RDF xmlns="http://www.example.org/message#"
         xmlns:owl="http://www.w3.org/2002/07/owl#"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
         xmlns:xsd ="http://www.w3.org/2001/XMLSchema#">

  <owl:Ontology rdf:about="">
    <rdfs:comment>The Common Alerting Protocol Ontology</rdfs:comment>
    <rdfs:label>CAP Ontology</rdfs:label> 
  </owl:Ontology>

  <owl:Class rdf:ID="Message">
    <rdfs:label>CAP alert message</rdfs:label>
    <rdfs:comment>...</rdfs:comment>
  </owl:Class>

  <owl:Class rdf:ID="AlertStatus">
    <owl:oneOf rdf:parseType="Collection">
      <owl:Thing rdf:about="#Actual" />
      <owl:Thing rdf:about="#Exercise" />
      <owl:Thing rdf:about="#System" />
      <owl:Thing rdf:about="#Test" />
      <owl:Thing rdf:about="#Draft" />
    </owl:oneOf>
  </owl:Class>

  <owl:DatatypeProperty rdf:ID="hasSender">
    <rdfs:domain rdf:resource="#Message" />
    <rdfs:range rdf:resource="&xsd;string" />
  </owl:DatatypeProperty>  

  <owl:ObjectProperty rdf:ID="hasStatus">
    <rdfs:domain rdf:resource="#Message"/>
    <rdfs:range rdf:resource="#AlertStatus"/>
  </owl:ObjectProperty>

  <Message rdf:ID="KSTO1055887203">
    <hasSender>KSTO</hasSender>
    <hasStatus rdf:resource="#Actual"/>
  </Message>

  <Message rdf:ID="KAR0-0306112239-SW">
    <hasSender>KARO</hasSender>
    <hasStatus rdf:resource="#Actual"/>
  </Message>

</rdf:RDF>

如果我查询:

PREFIX foo: <http://www.example.org/message#>
SELECT * WHERE { ?subject foo:hasSender ?object }

,我明白了:

----------------------------------
| subject              |  object |
==================================
| KAR0-0306112239-SW   | "KARO"@ |
| KSTO1055887203       | "KSTO"@ |
----------------------------------

当我尝试仅检索带有hasSender 值“KARO”的消息时:

PREFIX foo: <http://www.example.org/message#>
SELECT * WHERE { ?subject foo:hasSender "KARO"}

,查询不返回任何结果。我的 RDF/OWL 有什么问题吗?我错过了命名空间还是什么?

编辑:我使用 Protege v4.3.0,无论是否启动推理器 (HermiT),我都没有得到任何结果。我还编辑了我的第一个查询的输出。有一个尾随的“@”符号,我不确定它是否有意义。我没有在任何地方声明所涉及的字符串的语言(我提到这一点是因为我的理解是@符号用于声明字符串的语言,如"KARO"@en)。

【问题讨论】:

  • 会是你的引擎吗?我已尝试使用 Jena 对您的文件进行查询,结果返回 KAR0-0306112239-SW
  • 试试“KARO”^^xsd:string。本体将 hasSender 的范围定义为 xsd:string,因此您的引擎可能需要它。
  • @scozy 这可能是我使用的引擎。我编辑了我的帖子以提及 Protege。我不知道耶拿,我应该试试看。
  • @AndyS 我确实在某个时候尝试过 "KARO"^^xsd:string,但不幸的是它也没有用。
  • @lalibi,如果你想玩弄 Jena,Twinkle 是一个很好的工具。

标签: xml rdf sparql owl


【解决方案1】:

您没有使用绝对 IRI

如果在 Turtle 或 N3 序列化中查看数据,则通常更容易找出要编写的正确 SPARQL 查询,因为这些序列化更接近 SPARQL 查询的语法。在这种情况下,您的数据是:

@prefix :      <http://www.example.org/message#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#System>
        a       owl:Thing .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Message>
        a             owl:Class ;
        rdfs:comment  "..." ;
        rdfs:label    "CAP alert message" .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Actual>
        a       owl:Thing .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#hasStatus>
        a            owl:ObjectProperty ;
        rdfs:domain  <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Message> ;
        rdfs:range   <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#AlertStatus> .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Draft>
        a       owl:Thing .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#KAR0-0306112239-SW>
        a           :Message ;
        :hasSender  "KARO" ;
        :hasStatus  <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Actual> .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Exercise>
        a       owl:Thing .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf>
        a             owl:Ontology ;
        rdfs:comment  "The Common Alerting Protocol Ontology" ;
        rdfs:label    "CAP Ontology" .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#KSTO1055887203>
        a           :Message ;
        :hasSender  "KSTO" ;
        :hasStatus  <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Actual> .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#hasSender>
        a            owl:DatatypeProperty ;
        rdfs:domain  <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Message> ;
        rdfs:range   xsd:string .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Test>
        a       owl:Thing .

<file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#AlertStatus>
        a          owl:Class ;
        owl:oneOf  ( <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Actual> <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Exercise> <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#System> <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Test> <file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf#Draft> ) .

现在,值得指出的是,可能没有文件:file:///home/taylorj/tmp/sparql-owl-individuals/data.rdf,因此在您的数据中看到它可能会令人惊讶。问题是您的原始数据中没有声明 XML 基础,因此您获得的实际 IRI 是不明确的,并且在这种情况下取​​决于数据的实际位置。

在 RDF/XML 序列化中,您可以提供带有 xml:base 属性的 XML 基础。在你的情况下,它会是这样的:

<rdf:RDF xmlns="http://www.example.org/message#"
         xml:base="http://www.example.org/message#"
         xmlns:owl="http://www.w3.org/2002/07/owl#"
         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#"
         xmlns:xsd ="http://www.w3.org/2001/XMLSchema#">

无前缀 xmlns 用作无前缀元素名称的前缀,但您仍需要 XML 基础来解析元素上的 rdf:about 属性。

查询结果

即使有这些相对的 IRI,我仍然是您查询的结果。使用 Jena 的命令行 sparql 工具,我得到以下查询结果:


PREFIX foo: <http://www.example.org/message#>
SELECT * WHERE { ?subject foo:hasSender ?object }
------------------------------------------
| subject                       | object |
==========================================
| <data.rdf#KAR0-0306112239-SW> | "KARO" |
| <data.rdf#KSTO1055887203>     | "KSTO" |
------------------------------------------

PREFIX foo: <http://www.example.org/message#>
SELECT * WHERE { ?subject foo:hasSender "KARO"}
---------------------------------
| subject                       |
=================================
| <data.rdf#KAR0-0306112239-SW> |
---------------------------------

在您编辑之后,我仍然不太确定发生了什么,但是在 RDF 中带有语言标签的文字被写为其词法形式,即字符串后跟 @ 后跟语言标签。例如,

"Joshua"@en
"Giosuè"@it

如果您看到的结果看起来像这样,但没有实际的语言标签,我不确定这意味着什么。也许您有一些带有语言标签的文字,但其中语言标签是空字符串。在任何情况下,您都可以通过更改查询来匹配这些情况,以查找词法形式为 "KARO" 的文字:

PREFIX foo: <http://www.example.org/message#>
SELECT * WHERE {
  ?subject foo:hasSender ?sender .
 filter( str(?sender) = "KARO" )
}

这不会对您向我们展示的数据产生影响,但如果您完全修改了它(就像您对查询的输出所做的那样),这可能会解决您的问题。我知道 Protégé 中的 SPARQL 查询功能也不会在您提供的输入文件上运行查询,而是在它写出的另一个临时文件上运行查询。这也可能会添加一些空的语言标签。

可能的推理机交互

不过,根据您查看结果的方式,我想由于这些值是相对 IRI,您可能会尝试以某种需要绝对 IRI 的方式显示它们。 (我不知道这样的方式是什么,但我不知道你的设置的一切。)

如果您使用的是 OWL 推理器,推理器提供给查询引擎的数据也可能与您在文件中看到的数据不同。正如 AndyS 在 cmets 中指出的那样,由于 hasSender 属性的范围被声明为xsd:string,因此推理器可能采用三元组

<data.rdf#KAR0-0306112239-SW> hasSender "KARO" 

并将其转化为

<data.rdf#KAR0-0306112239-SW> hasSender "KARO"^^xsd:string

对你来说,在这种情况下你需要使用查询

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX foo: <http://www.example.org/message#>
SELECT * WHERE { ?subject foo:hasSender "KARO"^^xsd:string }

【讨论】:

  • 我确实尝试过 "KARO"^^xsd:string 但无济于事。请参阅我的编辑的最后一部分,其中我提到了它在结果中显示的 @ 符号,起初认为它不值得一提。对于“你没有使用绝对 IRI”部分,我认为 'xmlns="example.org/message#"' 足以声明一个基本 URI,不是吗?
  • @lalibi 仅使用xmlns 是不够的,因为您仍然需要一个基础来解析rdf:about 属性。此外,实际结果中的@ 表明可能附加了语言标签。我已经更新了我的答案以涵盖该案例。
  • 原始查询仍然没有结果(我添加了 xml:base)。这可能是我正在使用的工具。您使用 filter 的查询按预期工作。我非常感谢您为此付出的时间。
猜你喜欢
  • 2013-09-11
  • 2016-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 2021-12-02
  • 2016-05-22
  • 1970-01-01
相关资源
最近更新 更多