【问题标题】:FILTER duplicate head bindings in RDF Collection CONSTRUCT with SPARQL 1.1在 RDF Collection CONSTRUCT 中使用 SPARQL 1.1 过滤重复的头部绑定
【发布时间】:2016-07-09 16:37:46
【问题描述】:

我正在尝试使用 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 约束,这使得这些额外的头部三元组对于使用该库进行列表重建有问题。我尝试了各种子查询、属性路径和过滤器,但我很坚持这一点。可能吗?

【问题讨论】:

  • 如果您可以显示您正在使用的完整构造查询,将会有所帮助。目前尚不清楚您要构建什么,因为您忽略了那部分。也不清楚您所说的“头节点”是什么意思;查询中没有?head...
  • 感谢您提供此解决方案@JoshuaTaylor 问题出在查询的 CONSTRUCT 部分(为了清楚起见,我现在添加了它)。我只是从这个:?range sc:hasCanvases ?listid .?listid rdf:first ?canvas .?listid rdf:rest ?mid . 更改为这个:?range sc:hasCanvases ?listid .?mid rdf:first ?canvas .?mid rdf:rest ?last .,它可以工作。似乎属性路径的主题迭代地绑定到路径中的每个匹配对象。因此,当在 CONSTRUCT 中引用时,它会显示类似 1-1、1-2、1-3、1-4、1-5 的模式。

标签: sparql rdf json-ld


【解决方案1】:

不清楚您要问什么,但它听起来就像您想编写一个 construct 查询,该查询将包含一个存在于数据中的列表。如果您提供示例数据,并且显示您尝试使用的完整查询,这会容易得多,因为这样我们就不用猜测了。在这个假设下,让我们从一些数据开始。这里有两件事,每件事都有一个与值列表相关的属性:

@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>

where 部分甚至可以更简洁一些,因为您不使用 ?list 的值:

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

【讨论】:

  • 我再次回到这个问题,发现查询没有返回列表的第一个 rdf:first。 (例如 ?list 也有一个 rdf:first)这是重要的部分,因为 json-ld 库需要识别列表“头”以重建序列。集合的构造具有以下语义: ?list rdf:first 。 ?list rdf:rest _:b1 。 _:b1 rdf:first ... 以此类推。
  • @ChristopherJohnson 提供的查询确实获得了列表中的第一个元素。关键是?list rdf:rest* ?mid . ?mid rdf:first ?value .中的属性路径使用了*,这意味着?mid的一个值与?list相同,所以?value的一个值是列表中的第一个元素。
  • 所以如果语法构造是 (elt* A path of elt 出现零次或多次),并且值 ?list 只是 :hasList 的出现,那么 ?list 也会是rdf:rest 的出现,不是吗?对我来说疯狂的是,它确实在一个数据集上工作,但现在它不起作用,所以我不能肯定地说这是不正确的。我当前的解决方法是最初获取?list rdf:rest 节点并将其用作查询中的静态构造值(以避免重复),并为 ?list rdf:first 添加一个变量作为 ?first...然后一切正常。
  • @Christopher 当属性路径的长度为零时,表示开始和结束是同一个节点。所以 ?a p* ?b 与 ?a == ?b 匹配,即使没有使用属性 p 的三元组。
  • 快速跟进。我修复了数据中导致缺少第一个元素的问题。 rdf:rest 未在元素的子节点“子列表”中设置为 rdf:nil。如果没有这些 rdf:nil tail 语句,jsonld 列表构造函数将不起作用。关于作为身份属性的零的属性路径长度,这是非常有趣和有用的,并且被证实是正确的。谢谢。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多