在RDF-store上查询子数据属性

时间:2018-02-04 11:21:58

标签: sparql rdf owl ontology rdfs

在我的本体论中,我有一个名为“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"

但是,

我怎么能只使用两个办公室电话而不使用特定属性“:办公室电话”?一些猫头鹰:限制或定义??

谢谢!

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" .

问候!