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

具有唯一谓词的SPARQL可传递查询,sparql,rdf,jena,sparqlwrapper,geosparql,Sparql,Rdf,Jena,Sparqlwrapper,Geosparql,我有许多三元组,如下所示 :A :hasB :B :B :hasC :C :C :hasD :D :D :hasE :E ............ :X :hasY :Y :Y :hasZ :Z Output 1: -------- hasB hasC hasD .... hasZ Output 2: -------- :B :hasC :C :C :hasD :D :D :hasE :E ............ :X :hasY :Y 所有谓词都是唯一的。 我需要编写两个SPARQL

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

:A :hasB :B
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y 
:Y :hasZ :Z
Output 1:
--------
hasB
hasC
hasD
....
hasZ
Output 2:
--------
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y
所有谓词都是唯一的。

我需要编写两个SPARQL查询

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

:A :hasB :B
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y 
:Y :hasZ :Z
Output 1:
--------
hasB
hasC
hasD
....
hasZ
Output 2:
--------
:B :hasC :C
:C :hasD :D
:D :hasE :E
............
:X :hasY :Y
第2部分将通过一个可传递查询找到介于
:A
:Z
之间的三元组。输出2应该如下所示

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

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

SPARQL有一些明显的限制,因为它不是一种图形查询语言。可能的解决办法如下:

如果除了
之外没有其他谓词,则has[A-Z]
: 样本数据 如果除了
之外还有其他谓词has[A-Z]
: 样本数据 查询:
  • 在属性URI上使用正则表达式:

    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 .
    }
    
    前缀:
    选择?p
    在哪里{
    值(?开始?结束){(:A:E)}
    启动(|!)*?v1。
    ?v1?p?v2。
    过滤器(正则表达式(STRAFTER(STR(?p),STR(:),'has[A-Z]'))
    v2(!)*?结束。
    }
    

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

    这在当前数据中是不可能的。属性路径表达式中不能有正则表达式模式。一种解决方法是引入超级属性
    :has
    ,并在查询中使用它。如果您的数据没有其他属性,您也可以尝试使用通配符模式 并查询路径。我知道您再次忽略了此注释,但是:您从未接受任何问题的答案。对不起,StackOverflow不是这样工作的。谢谢你的帮助。只接受一个答案。关于你的问题,我很快会做更多的。是否可以选择添加超级属性
    :has
    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 .
    }