【发布时间】:2020-09-25 06:25:57
【问题描述】:
鉴于以下架构,可以很容易地看到“司机-乘客”血统:
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> .
现在让“司机-乘客后代”成为行程序列末尾的任意tp:passenger,其中一次行程的tp:passenger 是下一次行程的tp:driver
例如。 <ruth> 是 <alice> 的后代,按照以下行程顺序:
<trip2> -> <trip3> -> <trip4>.
问题: 如何获取所有驾驶员-乘客血统的(祖先,后代)对?
尝试 1:
我最初尝试使用以下 CONSTRUCT 子查询来定义对象属性: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: 我试图创建将祖先表示为乘客司机的属性路径,但我认为我没有正确理解这应该如何工作:
(tp:driver/^tp:passenger)+
关于 MWE: 是否有某种 RDF 沙箱允许我通过定义像上面的 tp 这样的简单本体以及一些示例数据来创建 MWE?以下“游乐场”可用,但似乎都不支持定义玩具本体:SPARQL Playground、SPARQL Explorer。
相关内容说明:
此问题与a previous question 直接相关,但不再需要自己保存路径,这是 SPARQL 1.1 不直接支持的功能。
Joshua Taylor 的This answer 似乎相关,但没有解决特定类型路径的识别问题,例如上面定义的谱系。
【问题讨论】: