SPARQL查询某种启动方式和连接方式(Oracle)

SPARQL查询某种启动方式和连接方式(Oracle),sparql,triplestore,triples,Sparql,Triplestore,Triples,我正忙着在三联书店进行概念验证。我的结构如下: 定义了两种关系类型(三元组)。自上而下关系,其中子项是其父项的一部分(“isPartOf”),左右关系,其中有子项可以(可选)被另一版本的子项替换(“替换”) 此外,每个子项都有一个以日期为对象的“isValidStart”三元组。这意味着该子项自该日期起有效。 水平子组中的最后一个子组可以具有关系“isInvalidEnd”,这意味着在此日期之后,此组无效 我想做的是构建一个SPARQL查询,在那里我可以在特定的日期获取父母的孩子。这在SPAR

我正忙着在三联书店进行概念验证。我的结构如下:

定义了两种关系类型(三元组)。自上而下关系,其中子项是其父项的一部分(“isPartOf”),左右关系,其中有子项可以(可选)被另一版本的子项替换(“替换”)

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

我想做的是构建一个SPARQL查询,在那里我可以在特定的日期获取父母的孩子。这在SPARQL中是可能的吗?我怎么做

我知道在Oracle中有任何一种以/CONNECT BY函数开头的函数都可以做一些类似的事情……但在SPARQL世界中我该如何做呢

谢谢

“/metadata/puid/test1”。
"2015-04-01"^^ .
“/metadata/puid/test2”。
"2015-04-01"^^ .
“/metadata/puid/test3”。
"2015-04-01"^^ .
“/metadata/puid/test4”。
"2015-04-01"^^ .
“/metadata/puid/test4”。
"2015-04-01"^^ .
“/metadata/puid/test4”。
"2015-04-01"^^ .
“/metadata/puid/test7”。
"2015-07-01"^^ .
“/metadata/puid/test5”。
"2015-04-01"^^ .
“/metadata/puid/test5”。
"2015-04-01"^^ .
“/metadata/puid/test5”。
"2015-04-01"^^ .
“/metadata/puid/test9”。
"2015-07-01"^^ .
“/metadata/puid/test10”。
"2015-05-01"^^ .
“/metadata/puid/test13”。
"2015-08-01"^^ .
"2015-12-01"^^ .

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

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

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

前缀:
前缀xsd:
选择?子对象
哪里
{
#我们有两个选择要检查
#1.所有未更换的儿童
{ 
#获取有效的开始值
?子项:isValidStart?开始
#开始日期在给定日期之前
过滤器(?开始<“2015-04-01”^^xsd:日期)
#而且没有其他的替代品
筛选器不存在{?otherChild:替换?child}
}
联合
#2.未更换的儿童
{ 
#替换其他子项的开始日期
?子项:isValidStart?开始;
:替换?某个孩子
#但他们自己还没有被取代
筛选器不存在{?otherChild:替换?child}
#开始日期在给定日期之前
过滤器(?开始<“2015-04-01”^^xsd:日期)
#在给定日期之前没有结束日期
筛选器不存在{?子项:isValidEnd?结束
过滤器(?结束<“2015-04-01”^^xsd:日期)
}
}
}

我研究了一个解决方案,找到了一个可行的解决方案。我将此方法放在一个函数中,可用于查找该项(父项)下的有效子项。递归调用此函数时,我会得到一个完整的树,其中只包含有效项

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) }        
 }
前缀:
前缀xsd:
选择?子项?开始日期?结束日期
哪里
{ 
#获取有效的开始值
?子项:isValidStart?起始日期
绑定(iri(“| |$parent | |“”)作为?父项)
筛选器存在{{子项:isPartOf?父项}
联合{
?子版本(:替换)+上一版本。
?上一版本:iPartOf?家长
} 
}
#而且没有其他有效的替代儿童
筛选器不存在{替换:替换子项;
:isValidStart?StartDaterReplace

过滤器(?StartDaterReplace你能显示RDF数据吗?是的,这很容易通过SPARQLI添加三元组实现。有一些“替换”为更新的“文档”,应该根据选择日期选择正确的文档OK,谢谢。这是否意味着a)给定一个父(组)的日期,你希望拥有其所有子(组)还是b)你想只拥有在给定日期有效的子项吗?我只想要1,子项的最新版本。如果isValidEnd在所选日期之前,也可能没有。感谢此解决方案。我将在今天晚些时候测试结果并确认它是否起作用。我认为这是正确的或接近于我猜这不是你想要的,但接下来我将调整查询。可能对我有帮助的是,根据您已经给定的样本数据提供样本日期和预期结果。它现在返回所有有效的子项,而不仅仅是子项的最后有效版本?您希望如何获得样本数据?它只是简单的“emtpy”“目前的xml文档如下:我可以向您提供一个MarkLogic XQuery脚本,将所有数据插入MarkLogic,但我不知道您需要什么格式。我不确定这是否是最简单的解决方案,但它提供了预期的结果。我仍在学习SPARQL(这项技术的新成员)