1

我有许多三元组,如下所示。

:A :hasB :B
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y 
:Y :hasZ :Z

所有谓词都是唯一的。

我需要编写两个 SPARQL 查询。

查询 1 将通过传递查询(类似 this )找到:Ato之间的所有谓词。输出 1 应如下所示。:Z:A :has* :Z

Output 1:
--------
hasB
hasC
hasD
....
hasZ

Ouery 2 将通过传递查询:A找到to之间的三元组。输出 2 应如下所示。:Z

Output 2:
--------
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y

请让我知道如何编写这些传递 SPARQL 查询。

4

1 回答 1

1

SPARQL 有一些明显的局限性,因为它不是图形查询语言。以下可能的解决方案:

如果除了 没有其他谓词has[A-Z]

样本数据

@prefix : <http://ex.org/> .
:A :hasB :B .
:B :hasC :C .
:C :hasD :D .
:D :hasE :E .

询问

prefix : <http://ex.org/>
select ?p
where {
values (?start ?end) { (:A :E) }
  ?start (<p>|!<p>)* ?v1 .
  ?v1 ?p ?v2 .
  ?v2 (<p>|!<p>)* ?end .
}

输出

---------
| p     |
=========
| :hasB |
| :hasC |
| :hasD |
| :hasE |
---------

如果除了 之外还有其他谓词has[A-Z]

样本数据

@prefix : <http://ex.org/> .
:A :hasB :B .
:B :hasC :C .
:C :hasD :D .
:C :notHasD :D .
:D :hasE :E .
  1. 引入一个超级属性:has

    附加数据:

    @prefix : <http://ex.org/> .
    @prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
    :hasB rdfs:subPropertyOf :has .
    :hasC rdfs:subPropertyOf :has .
    :hasD rdfs:subPropertyOf :has .
    :hasE rdfs:subPropertyOf :has .
    

    询问:

    prefix : <http://ex.org/>
    prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
    select ?p
    where {
    values (?start ?end) { (:A :E) }
      ?start (<p>|!<p>)* ?v1 .
      ?v1 ?p ?v2 . ?p rdfs:subPropertyOf :has .
      ?v2 (<p>|!<p>)* ?end .
    }
    

    输出

    ---------
    | p     |
    =========
    | :hasB |
    | :hasC |
    | :hasD |
    | :hasE |
    ---------
    
  2. 在属性 URI 上使用 REGEX:

    prefix : <http://ex.org/>
    select ?p
    where {
      values (?start ?end) { (:A :E) }
      ?start (<p>|!<p>)* ?v1 .
      ?v1 ?p ?v2 . 
      FILTER(REGEX(STRAFTER(STR(?p), STR(:)), 'has[A-Z]'))
      ?v2 (<p>|!<p>)* ?end .
    }
    

请注意,所有建议的解决方案都不适用于所有类型的数据,尤其是当您有多个路径和/或循环时。在这种情况下,您应该使用适当的图形数据库。

于 2017-11-22T08:23:13.877 回答