某种START WITH和CONNECT BY(Oracle)的SPARQL查询

时间:2017-07-06 16:43:10

标签: sparql triplestore triples

我正忙于使用三重商店进行概念验证。我有以下结构:

enter image description here

定义了两种关系类型(三元组)。孩子所属的自上而下的关系(“isPartOf”是其父级和左右级,其中有孩子,CAN(可选)被另一个版本的孩子替换(“替换”)。

每个孩子都有一个“isValidStart”三元组,日期为对象。这意味着此孩子自该日期起有效。 水平子组中的最后一个子组可以具有关系“isInvalidEnd”,这意味着在此日期之后该组无效。

我想要做的是构建一个SPARQL查询,我可以在特定日期获取父项的子项。这是可能的SPARQL,我该怎么做?

我知道在Oracle中有任何类型的START WITH / CONNECT BY函数可以执行某些操作......但是我在SPARQL世界中如何做到这一点。

由于

</metadata/puid/test2> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test1" .
</metadata/puid/test2> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test3> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test2" .
</metadata/puid/test3> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test4> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test3" .
</metadata/puid/test4> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test5> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test4" .
</metadata/puid/test5> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test6> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test4" .
</metadata/puid/test6> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test7> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test4" .
</metadata/puid/test7> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test8> <http://purl.org/dc/terms/replaces> "/metadata/puid/test7" .
</metadata/puid/test8> <http://purl.org/dc/terms/isValidStart> "2015-07-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test9> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test5" .
</metadata/puid/test9> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test10> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test5" .
</metadata/puid/test10> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test11> <http://purl.org/dc/terms/isPartOf> "/metadata/puid/test5" .
</metadata/puid/test11> <http://purl.org/dc/terms/isValidStart> "2015-04-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test12> <http://purl.org/dc/terms/replaces> "/metadata/puid/test9" .
</metadata/puid/test12> <http://purl.org/dc/terms/isValidStart> "2015-07-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test13> <http://purl.org/dc/terms/replaces> "/metadata/puid/test10" .
</metadata/puid/test13> <http://purl.org/dc/terms/isValidStart> "2015-05-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test14> <http://purl.org/dc/terms/replaces> "/metadata/puid/test13" .
</metadata/puid/test14> <http://purl.org/dc/terms/isValidStart> "2015-08-01"^^<http://www.w3.org/2001/XMLSchema#date> .
</metadata/puid/test14> <http://purl.org/dc/terms/isValidEnd> "2015-12-01"^^<http://www.w3.org/2001/XMLSchema#date> .

//免责声明:我是SPARQL世界的新手

2 个答案:

答案 0 :(得分:2)

不完全确定这是否是您所要求的,但内联评论:

给定日期:"2015-04-01"^^xsd:date

PREFIX : <http://purl.org/dc/terms/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT  ?child
WHERE
  {
   # we have two options to check
   # 1. all children that have not been replaced 
      { 
        # get the valid start values 
        ?child  :isValidStart  ?start 
        # where the start was before the given date
        FILTER ( ?start < "2015-04-01"^^xsd:date )
        # and there was no other replacing child
        FILTER NOT EXISTS { ?otherChild  :replaces  ?child }
      }
    UNION 
   # 2. children that haven been replaced
      { 
        # start date of children that replace others
        ?child  :isValidStart  ?start ;
                :replaces      ?someChild
        # but haven not been replaced themselves
        FILTER NOT EXISTS { ?otherChild  :replaces  ?child }
        # where the start was before the given date
        FILTER(?start < "2015-04-01"^^xsd:date) 
        # and there isn't an end date before the given date
        FILTER NOT EXISTS { ?child  :isValidEnd  ?end
                            FILTER ( ?end < "2015-04-01"^^xsd:date )
                          }
      }
  }

答案 1 :(得分:1)

我致力于一个解决方案,我找到了一个有效的解决方案。我将此方法放在一个函数中,我可以用它来查找该项(父项)下面的有效子项。

时,我得到一个完整的树,只有有效的项目
PREFIX : <http://purl.org/dc/terms/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

SELECT  ?child ?startDate ?endDate
WHERE
{ 
    # get the valid start values 
    ?child  :isValidStart  ?startDate


    BIND(iri("'||$parent||'") as ?parent) 
    FILTER EXISTS{ {?child :isPartOf ?parent }
                  UNION { 
                    ?child (:replaces)+ ?prevVersion .
                    ?prevVersion :isPartOf ?parent
                   } 
                 }
    # and there was no other valid replacing child
    FILTER NOT EXISTS { ?replacer  :replaces  ?child ;
                                   :isValidStart ?startDateReplacer
                        FILTER (?startDateReplacer <= "'||$selectionDate||'"^^xsd:date)
                      } 

    # where the start was before/at the given date
    FILTER(?startDate <= "'||$selectionDate||'"^^xsd:date)

    OPTIONAL { ?child :isValidEnd ?endDate }

    # and not end date is before/at selection date        
    FILTER NOT EXISTS { FILTER (?endDate <= "'||$selectionDate||'"^^xsd:date) }        
 }