ontology 限制对 SPARQL 最终结果的影响
Consequence of restrictions in ontology on SPARQL end results
我担心 ontology (dgo.owl) 的两个 classes (SensingDevice 和 属性),如下图所示。这两个 classes 通过 observes 属性:
连接
相关的ontology部分如下:
<owl:Class rdf:about="http://www.iiitd.edu.in/~haroonr/ontologies/DGO#TemperatureSensor_Livingroom">
<rdfs:subClassOf rdf:resource="http://purl.oclc.org/NET/ssnx/ssn#SensingDevice"/>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="http://purl.oclc.org/NET/ssnx/ssn#observes"/>
<owl:allValuesFrom rdf:resource="http://purl.oclc.org/NET/ssnx/qu/dim#Temperature"/>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
现在,使用 SPARQL 查询我想知道哪个 属性 被 TemperatureSensor_Livingroom class 观察到,它是一个子 [= 传感设备 的 61=]。同样,我使用以下查询:
SELECT ?y
WHERE {
dgo:TemperatureSensor_Livingroom rdfs:subClassOf ?p .
?p owl:allValuesFrom ?y .
}
通过这个查询我确实得到了所需的结果,但我不明白如果不使用 observes 属性 我是如何得到结果的?我尝试使用 observes 属性 来制定不同的查询,但其中 none 会导致所需的答案。我认为在这种情况下我会通过一些技巧获得结果,但我想知道这种情况的正确查询。我可能是错的,但我认为限制在后台做一些我无法获得的事情。这些限制是否影响我们应该查询的方式?
更新:
从 Artemis 和 Chris 的回答中,我发现在这种情况下,没有充分的理由直接在 SPARQL 查询中使用 observes 属性,因为在提到的答案。有了这个,我发现了另一个相关的用例:
Ontology 是相同的 (dgo.owl),只是我添加了一些 class 描述 above.Now 如果我查询与前面提到的相同的东西大小写,即
SELECT ?y
WHERE {
dgo:TemperatureSensor_Livingroom rdfs:subClassOf ?p .
?p owl:allValuesFrom ?y .}
正如预测的那样,它产生的输出为:
----------------------------------------------------------
| x | y |
==========================================================
| | dgo:PhysicalInput |
| | <http://purl.oclc.org/NET/ssnx/qu/dim#Temperature>
换句话说,它产生与两个属性相关的输出,即 observes 和 detects。在这种情况下,我如何才能获得与 observes 属性 相关的输出。
如果您编写以下查询:
SELECT distinct *
WHERE {
dgo:TemperatureSensor_Livingroom rdfs:subClassOf ?o.
?o ?p ?y.
}
您正在提取与 dgo:TemperatureSensor_Livingroom
相关的所有内容,它也是 ?o
的子类。如果查看 ?p
列,您可以看到只有 observers only temperature
通过 owl:allValuesFrom 连接。这样就不用指定类型了
如果您将查询更改为:
prefix dgo: <http://www.iiitd.edu.in/~haroonr/ontologies/DGO#>
SELECT distinct *
WHERE {
?s rdfs:subClassOf ?o.
?o owl:allValuesFrom ?y.
}
您可以看到它再次 observers only temperature
出现。所以基本上我想说的是,你限制三元组中每个成员的方式对你在下一阶段提取的内容有直接影响。希望这对您有所帮助!
更新 1:
根据您更新的查询,您只需要在查询中命名您想要的对象 属性:
prefix dgo: <http://www.iiitd.edu.in/~haroonr/ontologies/DGO#>
prefix ssn: <http://purl.oclc.org/NET/ssnx/ssn#>
SELECT *
WHERE {
dgo:TemperatureSensor_Livingroom rdfs:subClassOf ?p .
?p owl:allValuesFrom ?y .
?p owl:onProperty ssn:observes
}
那是因为您正在查询 TBOX,并且您查询中的 ?p
转换为表示匿名 class 限制的 bnode。您没有绑定到查询中的实例,而是绑定到用于 owl:allValuesFrom
限制的 value/class。所以
http://purl.oclc.org/NET/ssnx/qu/dim#Temperature
将是您查询的结果。如果您想搜索构成匿名 class 的个人,您可以使用 observes
属性。查看您的数据,您尚未创建任何使用 observes
的实例,因此显然没有使用它。
我担心 ontology (dgo.owl) 的两个 classes (SensingDevice 和 属性),如下图所示。这两个 classes 通过 observes 属性:
连接相关的ontology部分如下:
<owl:Class rdf:about="http://www.iiitd.edu.in/~haroonr/ontologies/DGO#TemperatureSensor_Livingroom">
<rdfs:subClassOf rdf:resource="http://purl.oclc.org/NET/ssnx/ssn#SensingDevice"/>
<rdfs:subClassOf>
<owl:Restriction>
<owl:onProperty rdf:resource="http://purl.oclc.org/NET/ssnx/ssn#observes"/>
<owl:allValuesFrom rdf:resource="http://purl.oclc.org/NET/ssnx/qu/dim#Temperature"/>
</owl:Restriction>
</rdfs:subClassOf>
</owl:Class>
现在,使用 SPARQL 查询我想知道哪个 属性 被 TemperatureSensor_Livingroom class 观察到,它是一个子 [= 传感设备 的 61=]。同样,我使用以下查询:
SELECT ?y
WHERE {
dgo:TemperatureSensor_Livingroom rdfs:subClassOf ?p .
?p owl:allValuesFrom ?y .
}
通过这个查询我确实得到了所需的结果,但我不明白如果不使用 observes 属性 我是如何得到结果的?我尝试使用 observes 属性 来制定不同的查询,但其中 none 会导致所需的答案。我认为在这种情况下我会通过一些技巧获得结果,但我想知道这种情况的正确查询。我可能是错的,但我认为限制在后台做一些我无法获得的事情。这些限制是否影响我们应该查询的方式?
更新: 从 Artemis 和 Chris 的回答中,我发现在这种情况下,没有充分的理由直接在 SPARQL 查询中使用 observes 属性,因为在提到的答案。有了这个,我发现了另一个相关的用例:
Ontology 是相同的 (dgo.owl),只是我添加了一些 class 描述 above.Now 如果我查询与前面提到的相同的东西大小写,即
SELECT ?y
WHERE {
dgo:TemperatureSensor_Livingroom rdfs:subClassOf ?p .
?p owl:allValuesFrom ?y .}
正如预测的那样,它产生的输出为:
----------------------------------------------------------
| x | y |
==========================================================
| | dgo:PhysicalInput |
| | <http://purl.oclc.org/NET/ssnx/qu/dim#Temperature>
换句话说,它产生与两个属性相关的输出,即 observes 和 detects。在这种情况下,我如何才能获得与 observes 属性 相关的输出。
如果您编写以下查询:
SELECT distinct *
WHERE {
dgo:TemperatureSensor_Livingroom rdfs:subClassOf ?o.
?o ?p ?y.
}
您正在提取与 dgo:TemperatureSensor_Livingroom
相关的所有内容,它也是 ?o
的子类。如果查看 ?p
列,您可以看到只有 observers only temperature
通过 owl:allValuesFrom 连接。这样就不用指定类型了
如果您将查询更改为:
prefix dgo: <http://www.iiitd.edu.in/~haroonr/ontologies/DGO#>
SELECT distinct *
WHERE {
?s rdfs:subClassOf ?o.
?o owl:allValuesFrom ?y.
}
您可以看到它再次 observers only temperature
出现。所以基本上我想说的是,你限制三元组中每个成员的方式对你在下一阶段提取的内容有直接影响。希望这对您有所帮助!
更新 1: 根据您更新的查询,您只需要在查询中命名您想要的对象 属性:
prefix dgo: <http://www.iiitd.edu.in/~haroonr/ontologies/DGO#>
prefix ssn: <http://purl.oclc.org/NET/ssnx/ssn#>
SELECT *
WHERE {
dgo:TemperatureSensor_Livingroom rdfs:subClassOf ?p .
?p owl:allValuesFrom ?y .
?p owl:onProperty ssn:observes
}
那是因为您正在查询 TBOX,并且您查询中的 ?p
转换为表示匿名 class 限制的 bnode。您没有绑定到查询中的实例,而是绑定到用于 owl:allValuesFrom
限制的 value/class。所以
http://purl.oclc.org/NET/ssnx/qu/dim#Temperature
将是您查询的结果。如果您想搜索构成匿名 class 的个人,您可以使用 observes
属性。查看您的数据,您尚未创建任何使用 observes
的实例,因此显然没有使用它。