我使用Protege创建本体
这是本体的概念:
class : Human
dataProperties :
hasName ( Domain: Human)
hasHeight ( Domain: Human)
hasWeight ( Domain: Human)
class : Man - subClassOf Human
dataProperties :
hasWife ( Domain: Man)
我想使用Sparql来查询Class:Man的所有Dataproperties 不仅(hasWife),而且(hasName,hasHeight,hasWeight)
我是否需要指定DataProperties限制,例如min:1?
这里的主要目标是找到 如果我想创建一个单独的类:Man
如何找到所需的所有属性?
因为每个男人都应该有名字,身高和体重。
答案 0 :(得分:2)
class : Human dataProperties : hasName ( Domain: Human) hasHeight ( Domain: Human) hasWeight ( Domain: Human) class : Man - subClassOf Human dataProperties : hasWife ( Domain: Man)
我想使用Sparql来查询类:人的所有Dataproperties都没有 only(hasWife),还有(hasName,hasHeight,hasWeight)
首先,请记住类在OWL中没有属性。属性可以包含域和范围,但所有这些意味着断言的主语(对象)是域(范围)的成员。虽然 是 class 的概念,但它与(单一调度)面向对象的编程语言并不完全相同,其中属性"属于"上课。
那就是说,听起来你正在寻找拥有Man或Man超类的所有属性。 (请注意,我说"域名",而不是"域&#34 ;;属性可以有多个域。事实上,如果你说hasWife的域名是Man,那么那么人类也是hasWife的财产;毕竟,如果你知道hasWife(x,y),你知道x必须是人类。)这不是太难:
select ?p where {
?p rdfs:domain ?class .
:Man rdfs:subClassOf* ?class .
}
这就是找到具有域?类的?p的值,其中:man通过rdfs:subClassOf链接的路径连接到?类。 *表示法意味着路径可以是任何长度,包括零。当路径长度为零时,意味着?类是:Man。如果使用^运算符生成后向路径,您实际上可以更简洁地编写此查询:
select ?p where {
?class ^rdfs:domain ?p ;
^rdfs:subClassOf* :Man
}
("域",因为属性可以有多个域。
答案 1 :(得分:0)
终于在这里找到了解决方案!
这是sparql
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX dar: <http://www.darrell.testSub#>
SELECT DISTINCT ?properties ?superclass ?propertyType
WHERE {
dar:Man rdfs:subClassOf* ?superclass.
?properties rdfs:domain ?superclass.
?properties rdf:type ?propertyType
}
但仍有一些问题。
Human ( human's properties)
--Man ( man's properties )
--Woman ( woman's properties )
在推理之后,我查询了
&LT; ?s rdfs:domain:Human&gt;
它返回(人类+男人+女人)的属性
如果我在那里使用sparql。我只能得到(人类+男人)的财产。
虽然这正是我想要的结果,但我无法弄明白为什么。