我只想在属性存在且具有指定值的情况下在SPARQL中返回结果

问题描述

我有一个猫头鹰本体,我认为如果Zone元素具有关联的Mission且这个Missiontasked,则该元素将被分配任务。

本体中的Zone类:http://myontology/Zone

  • 具有以下对象属性http://myontology/hasMission,其中目标是http://myontology/Mission
  • 以及以下字符串数据属性http://myontology/label

Mission类:http://myontology/Mission

  • 具有以下布尔数据属性http://myontology/tasked

我想知道是否要对特定的Zone进行任务。这意味着它具有hasMission对象属性,而目标Mission具有tasked数据属性,其值为true

我尝试过类似的事情:

SELECT ?label ?tasked
WHERE {
  ?zone rdf:type myontology:Zone .
  ?zone myontology:label "ZoneName" .
  ?zone myontology:label ?label .
  ?mission rdf:type myontology:Mission .
  OPTIONAL { ?mission myontology:tasked ?tasked }
  OPTIONAL { ?zone myontology:hasMission ?mission }
}

不幸的是,如果在本体中只有一个任务任务,即使没有?taskedMission相关联,我总是对Zone变量是正确的,例如: / p>

----------------------
| label | tasked |
======================
| "ZoneName" | "true"  |
----------------------

如果ZoneMission没有关联,我希望得到这样的结果:

----------------------
| label | tasked |
======================
| "ZoneName" |   |
----------------------

我做错了什么?

请注意,我不能这样做:

SELECT ?label ?tasked
WHERE {
  ?zone rdf:type myontology:Zone .
  ?zone myontology:label "ZoneName" .
  ?zone myontology:label ?label .
  ?mission rdf:type myontology:Mission .
  OPTIONAL { ?mission myontology:tasked ?tasked }
  ?zone myontology:hasMission ?mission
}

因为在这种情况下,如果ZoneMission没有关联,查询将不会返回任何结果。

解决方法

此查询似乎解决了我的问题,uninededuser是正确的! :

SELECT ?label ?tasked
WHERE {
  ?zone rdf:type myontology:Zone .
  ?zone myontology:label "ZoneName" .
  ?zone myontology:label ?label .
  ?mission rdf:type myontology:Mission .
  OPTIONAL { 
   ?mission myontology:tasked ?tasked .
   ?zone myontology:hasMission ?mission 
  }
}

我认为原因是因为在我最初的尝试中,两个OPTIONAL是分开的,所以引擎分开看它们。