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)
}
如果您还想查看指向同一个人的关系,可以删除过滤条件。
给定以下架构,可以很容易地看到“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)
}
如果您还想查看指向同一个人的关系,可以删除过滤条件。