微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决基于在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 PlaygroundSPARQL 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?