【问题标题】:SPARQL property paths based on a new property defined in a CONSTRUCT subquery基于 CONSTRUCT 子查询中定义的新属性的 SPARQL 属性路径
【发布时间】: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

例如。 &lt;ruth&gt;&lt;alice&gt; 的后代,按照以下行程顺序:

&lt;trip2&gt; -> &lt;trip3&gt; -> &lt;trip4&gt;.

问题: 如何获取所有驾驶员-乘客血统的(祖先,后代)对?

尝试 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 似乎相关,但没有解决特定类型路径的识别问题,例如上面定义的谱系。

【问题讨论】:

    标签: sparql rdf


    【解决方案1】:

    这个似乎可以解决问题:

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

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

    【讨论】:

    • 谢谢!但是,在使用实际数据进行查询时,Virtuoso 抱怨缺乏资源。我尝试了以下修改(仍然得到 42000):1)限制 10 个结果,2)在子查询中包装初始选择,3)为 ?driver 指定单个 IRI
    • 代替子查询,你能用VALUES吗? .您可以尝试使用增加内存限制来说 4G 吗?您也可以使用 100 的限制开始。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    • 2020-09-27
    • 2014-05-09
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2021-04-06
    相关资源
    最近更新 更多