如何解决基于在CONSTRUCT子查询中定义的新属性的SPARQL属性路径
基于以下模式,可以很容易地看到“驾驶员-乘客”血统:
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似乎很相关,但没有解决对特定类型路径的识别,例如上面定义的沿袭。
解决方法
这个似乎可以解决问题:
select ?driver ?passenger where {
?driver (^tp:driver/tp:passenger)+ ?passenger .
filter( ?driver != ?passenger)
}
如果您还希望看到导致同一个人的关系,则可以删除过滤条件。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。