在我的本体论中,我有一个名为“person”的实体,它有一个名为“member”的类子。有些像这样(缩进表示层次结构),
person
member
另外,我有一些属性(dataProperty),与“person”相关联,以及与“member”相关的其他属性。具体而言,该属性可以是电话号码。我以这种方式提出了属性层次结构,
phone (domain: person)
office-phone (domain: member)
office-phone-1 (domain: member)
office-phone-2 (domain: member)
personal-phone (domain: person)
我正在做以下事情,
SELECT ?s ?attr ?data
WHERE
{
value ?attr {:phone} .
?s rdf:type :member .
?s ?attr ?data .
}
获取所有电话号码,
instance-member :phone "value-of-personal-phone"
instance-member :phone "value-of-office-phone-1"
instance-member :phone "value-of-office-phone-2"
但是,
我怎么能只使用两个办公室电话而不使用特定属性“:办公室电话”?一些猫头鹰:限制或定义??
谢谢!
答案 0 :(得分:4)
首先,您必须在数据中使用属性层次结构,否则,这不起作用(如果您下次提供正确的样本数据会很好...):
@prefix : <http://example.org/> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema/> .
:officePhone rdfs:subPropertyOf :phone .
:officePhone1 rdfs:subPropertyOf :officePhone .
:officePhone2 rdfs:subPropertyOf :officePhone .
:personalPhone rdfs:subPropertyOf :phone .
:instance-member rdf:type :member .
:instance-member :personalPhone "value-of-personal-phone" .
:instance-member :officePhone1 "value-of-office-phone-1" .
:instance-member :officePhone2 "value-of-office-phone-2" .
关于查询,至少有两个选项:
1)三重存储支持推理,在您的示例中RDFS就足够了 - 那么您的查询就足够了。
2)您重写查询,以便使用SPARQL 1.1属性路径考虑属性层次结构:
prefix : <http://example.org/>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
prefix rdfs: <http://www.w3.org/2000/01/rdf-schema/>
SELECT ?s ?attr ?data
WHERE
{
values ?p {:officePhone}
?s rdf:type :member .
?attr rdfs:subPropertyOf* ?p .
?s ?attr ?data .
}
结果:
----------------------------------------------------------------
| s | attr | data |
================================================================
| :instance-member | :officePhone1 | "value-of-office-phone-1" |
| :instance-member | :officePhone2 | "value-of-office-phone-2" |
----------------------------------------------------------------
答案 1 :(得分:0)
...我以类似的方式得到它,显示超级属性,重新启动域并包含一个独特的...
SELECT distinct ?s ?attr_father ?data
WHERE
{
values ?attr_father {:phone} .
?s rdf:type :member .
?attr rdfs:subPropertyOf* ?attr_father .
?attr rdfs:domain :member .
?s ?attr ?data .
}
通过这种方式,我们得到了,
instance-member :phone "value-of-office-phone-1" .
instance-member :phone "value-of-office-phone-2" .
问候!