具有唯一谓词的SPARQL传递查询

时间:2017-11-22 03:40:02

标签: sparql rdf jena sparqlwrapper geosparql

我有很多三人组织如下。

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

所有谓词都是唯一的。

我需要编写两个SPARQL查询。

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

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

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

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

请告诉我如何编写这些传递的SPARQL查询。

1 个答案:

答案 0 :(得分: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 .
    }
    
  3. 请注意,所有提议的解决方案都不适用于所有类型的数据,尤其是一旦您有多个路径和/或周期。在这种情况下,您应该使用正确的图形数据库。