使用SPARQL 1.1在RDF Collection CONSTRUCT中过滤重复头部绑定

时间:2016-07-08 17:54:16

标签: sparql rdf json-ld

我正在尝试使用SPARQL 1.1属性路径构造完整的RDF集合。我见过的属性路径示例能够获得rdf:first节点,但我还没有看到能够获得整个链的一个,包括bnodes。查询的关键部分如下所示:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX sc: <http://iiif.io/api/presentation/2#>

CONSTRUCT {?range sc:hasCanvases ?listid .
?listid rdf:first ?canvas .
?listid rdf:rest ?mid .
?mid rdf:rest ?node .
?node rdf:first ?canvas .
?node rdf:rest ?last .
[...]}

WHERE {values ?range {<http://some.uri>}
?range sc:hasCanvases ?listid .
values ?e { rdf:first rdf:rest } 
?listid rdf:rest* ?mid . 
?mid ?e ?node FILTER (?mid != ?node). 
?listid rdf:first ?first .
?node rdf:first ?canvas .
?node rdf:rest ?last .
[...]}

它主要起作用,除了?listid节点绑定到属性路径中的每个rdf:rest ?mid对象。

jsonld.fromRDF方法中存在referencedOnce约束,这使得这些额外的头三元组在使用该库进行列表重建时会出现问题。我已经尝试了各种子查询,属性路径和FILTERS,但我对此非常感兴趣。可能吗?

2 个答案:

答案 0 :(得分:2)

您所要求的内容并不完全清楚,但听起来就像您要编写构造查询一样,该查询将包含数据中存在的列表。如果您提供示例数据,并且如果您显示您尝试使用的完整查询,则会更容易,因为那时我们可以更少地猜测。在这个假设下,让我们从一些数据开始。以下是两个属性,每个属性将每个属性与值列表相关联:

@prefix : <urn:ex:>

:a :hasList (1 2 3 4 5) .
:b :hasList (6 7 8 9 0) .

这是一个查询,它检索与:a 相关联的列表并构造它:

prefix : <urn:ex:>
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>

construct {
  ?mid rdf:first ?value ;
       rdf:rest ?tail .
}
where {
  :a :hasList ?list .
  ?list rdf:rest* ?mid .
  ?mid rdf:first ?value .
  ?mid rdf:rest ?tail .
}

结果:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="urn:ex:">
  <rdf:Description>
    <rdf:rest rdf:parseType="Resource">
      <rdf:rest rdf:parseType="Resource">
        <rdf:rest rdf:parseType="Resource">
          <rdf:rest rdf:parseType="Resource">
            <rdf:rest rdf:resource="http://www.w3.org/1999/02/22-rdf-syntax-ns#nil"/>
            <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
            >5</rdf:first>
          </rdf:rest>
          <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
          >4</rdf:first>
        </rdf:rest>
        <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
        >3</rdf:first>
      </rdf:rest>
      <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
      >2</rdf:first>
    </rdf:rest>
    <rdf:first rdf:datatype="http://www.w3.org/2001/XMLSchema#integer"
    >1</rdf:first>
  </rdf:Description>
</rdf:RDF>

其中部分甚至可以更简洁,因为您没有使用?list 的值:

  :a :hasList/rdf:rest* ?mid .
  ?mid rdf:first ?value .
  ?mid rdf:rest ?tail .

答案 1 :(得分:1)

我认为你正在寻找rdf:rest*/rdf:first成语来获取列表中的所有成员。请尝试以下操作(我假设?listid包含一个或多个RDF集合(列表)):

SELECT ?node
WHERE {
   values ?sequence {<http://some.uri>}
   ?sequence eg:hasThings ?listid .
   ?listid rdf:rest*/rdf:first ?node .
}