我在使用java代码中的sparql查询检索对象属性范围内的多个类时遇到问题(使用Protege 3.4.8)
Result1_Layer =
"PREFIX uni:<http://www.owl-ontologies.com/Ontology1469701449.owl#>"
+"PREFIX rdfs:<http://www.w3.org/2000/01/rdf-schema#>"
+ "select ?range1 "
+ "where { uni:hasS_Layer "
+ "rdfs:range ?range1}";
I am getting output as:| range1 |
=========================================
| <http://www.w3.org/2002/07/owl#Thing> |
| _:b0 |
| rdfs:Resource |
-----------------------------------------
但输出应包含两个类:可用性、可靠性而不是 b0。 本体中有一个对象属性hasS_Layer,其域为Layer,范围为可用性、可靠性的交集 如果范围内只有一个类,则此查询将检索正确的结果。 当我使用 Protegy 版本 4.3 时,相同的查询工作正常。但在 protege 3.4.8 中,它没有显示范围内多个类的正确输出。 请帮忙。
最佳答案
用 RDF 表示时,OWL 交集如下所示:
_:b0 a owl:Class;
owl:intersectionOf (ex:Usability, ex:Reliability) .
或者更详细地说明(如果我们扩展 RDF 集合的内部表示):
_:b0 a owl:Class;
owl:intersectionOf _:b1 .
_:b1 rdf:first ex:Usability ;
rdf:rest _:b2 .
_:b2 rdf:first ex:Reliability ;
rdf:rest rdf:nil .
您的查询返回 rdfs:range
的值属性,即 _:b0
- 这是对应于两个类的交集的匿名类。
如果您希望取回构成交集的类,则需要执行不同的查询,例如:
SELECT ?c
WHERE { uni:hasS_Layer rdfs:range ?r .
?r owl:intersectionOf/rdf:rest*/rdf:first ?c .
}
owl:intersectionOf/rdf:rest*/rdf:first
被称为路径表达式,它查询任何资源 ?r
有一个 owl:intersection
连接到零个或多个 rdf:rest
的属性属性,依次连接到 rdf:first
属性(property)。这是 rdf:first
的值我们想要的属性。
关于java - 在java中使用sparql查询检索对象属性范围内的多个类(Protege 3.4.8),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38640169/