SPARQL 属性 路径基于在 CONSTRUCT 子查询中定义的新 属性

SPARQL property paths based on a new property defined in a CONSTRUCT subquery

给定以下架构,可以很容易地看到“driver-passenger”血统:

tp:trip a owl:Class ;
    rdfs:label "trip"@en ;
    rdfs:comment "an 'asymmetric encounter' where someone is driving another person."@en .

tp:driver a owl:ObjectProperty ;
    rdfs:label "driver"@en ;
    rdfs:comment "has keys."@en ;
    rdfs:domain tp:trip ;
    rdfs:range tp:person .

tp:passenger a owl:ObjectProperty ;
    rdfs:label "passenger"@en ;
    rdfs:comment "has drinks."@en ;
    rdfs:domain tp:trip ;
    rdfs:range tp:person .

考虑以下数据:

<alice> a tp:person .
<grace> a tp:person .
<tim> a tp:person .
<ruth> a tp:person .

<trip1> a tp:trip ;
    tp:participants   <alice> , <grace> ;
    tp:driver         <alice> ;
    tp:passenger         <grace> .

<trip2> a tp:trip ;
    tp:participants   <alice> , <tim> ;
    tp:driver         <alice> ;
    tp:passenger         <tim> .

<trip3> a tp:trip ;
    tp:participants   <tim> , <grace> ;
    tp:driver         <tim> ;
    tp:passenger         <grace> .

<trip4> a tp:trip ;
    tp:participants   <grace> , <ruth> ;
    tp:driver         <grace> ;
    tp:passenger         <ruth> .

<trip5> a tp:trip ;
    tp:participants   <grace> , <tim> ;
    tp:driver         <grace> ;
    tp:passenger         <tim> .

现在让“driver-passenger 后代”成为旅行序列末尾的任何 tp:passenger,其中一次旅行的 tp:passenger 是下一次旅行的 tp:driver旅行

例如。根据以下行程顺序,<ruth><alice> 的后代:

<trip2> -> <trip3> -> <trip4>.

问题: 如何获得所有 driver-passenger 谱系的(祖先,后代)对?

尝试 1: 我最初尝试了以下 CONSTRUCT 子查询来定义一个 object 属性: tp:drove,它可以很容易地在 属性 路径中使用。但是,这对我的实际数据不起作用:

SELECT ?originalDriver ?passengerDescendent
WHERE {
    ?originalDriver tp:drove+ ?passengerDescendent .
    {
        CONSTRUCT { ?d tp:drove ?p . }
        WHERE { ?t a tp:trip .
                ?t tp:driver ?d . 
                ?t tp:passenger ?p .}        
    }
}

尝试 2: 我试图创建 属性 路径,将祖先表示为乘客的 driver,但我认为我没有正确理解它应该如何工作:

(tp:driver/^tp:passenger)+

关于 MWE: 是否有某种 RDF 沙箱允许我通过定义一个简单的 ontology 来创建 MWE,如上面的 tp,连同一些示例数据?以下“游乐场”可用,但其中 none 似乎支持定义玩具 ontology:SPARQL Playground, SPARQL Explorer


相关内容备注:

此问题与 a previous question 直接相关,但不再需要保存路径本身,这是 SPARQL 1.1 不直接支持的功能。

Joshua Taylor 的

This answer 似乎相关,但没有解决特定类型路径的识别问题,例如上面定义的谱系。

这个似乎可以解决问题:

select ?driver ?passenger where {
?driver (^tp:driver/tp:passenger)+ ?passenger .
filter( ?driver != ?passenger)
}

如果您还想查看指向同一个人的关系,可以删除过滤条件。