使用SPARQL 1.1筛选RDF集合构造中的重复头绑定

使用SPARQL 1.1筛选RDF集合构造中的重复头绑定,sparql,rdf,json-ld,Sparql,Rdf,Json Ld,我试图用SPARQL 1.1属性路径构建完整的RDF集合。我看到的属性路径示例能够获得rdf:first节点,但我还没有看到能够获得整个链(包括bNode)的示例。查询的关键部分如下所示: 前缀rdf: 前缀sc: 构造{?范围sc:hasCanvases?listid。 ?listid rdf:第一个?画布。 ?listid rdf:剩余?中间。 ?中间rdf:休息?节点。 ?节点rdf:第一个?画布。 ?节点rdf:剩余?最后一个。 [...]} 其中{值?范围{} ?范围sc:hasCan

我试图用SPARQL 1.1属性路径构建完整的RDF集合。我看到的属性路径示例能够获得rdf:first节点,但我还没有看到能够获得整个链(包括bNode)的示例。查询的关键部分如下所示:

前缀rdf: 前缀sc: 构造{?范围sc:hasCanvases?listid。 ?listid rdf:第一个?画布。 ?listid rdf:剩余?中间。 ?中间rdf:休息?节点。 ?节点rdf:第一个?画布。 ?节点rdf:剩余?最后一个。 [...]} 其中{值?范围{} ?范围sc:hasCanvases?列表ID。 值?e{rdf:first rdf:rest} ?listid rdf:rest*?mid。 ?mid?e?节点过滤器?mid!=?节点。 ?listid rdf:第一个?第一个。 ?节点rdf:第一个?画布。 ?节点rdf:剩余?最后一个。 [...]} 它主要起作用,除了?listid节点绑定到属性路径中的每个rdf:rest?mid对象之外


在jsonld.fromRDF方法中存在一个约束,这使得这些额外的头三元组对于使用该库重建列表是有问题的。我已经尝试过各种子查询、属性路径和过滤器,但我在这方面做得很好。可能吗

我认为您正在寻找rdf:rest*/rdf:first习惯用法来获取列表中的所有成员。我假设?listid包含一个或多个RDF Collectionlist,请尝试以下操作:

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

现在还不清楚您在问什么,但听起来您想编写一个构造查询,其中包含数据中存在的列表。如果您提供了示例数据,并且显示了您试图使用的完整查询,那么就容易多了,因为这样我们就没有那么多可猜测的了。在这个假设下,让我们从一些数据开始。这里有两个属性,每个属性都与值列表相关:

@前缀: :a:haslist1 2 3 4 5。 :b:haslist6 7 8 9 0。 以下是检索与:a关联的列表并构造它的查询:

前缀: 前缀rdf: 构造{ ?中间rdf:第一个?值; 休息?尾巴。 } 在哪里{ :a:hasList?列表。 ?列表rdf:rest*?mid。 ?中间rdf:第一个?值。 ?中间rdf:静止?尾部。 } 结果是:

5. 4. 3. 2. 1. 由于您不使用?列表的值,因此该部分甚至可以变得更加简洁:

:a:hasList/rdf:rest*?mid。 ?中间rdf:第一个?值。 ?中间rdf:静止?尾部。
如果您可以显示您正在使用的完整构造查询,这将有所帮助。由于您遗漏了该部分,所以不清楚您试图构建什么。也不清楚你所说的头部节点是什么意思;查询中没有?head…感谢您提供此解决方案@JoshuaTaylor问题出在查询的构造部分,为了清楚起见,我现在添加了它。我只是改变了这个:?范围sc:hasCanvases?列表id?listid rdf:第一个?画布?listid rdf:休息?中间。此:?范围sc:hasCanvases?列表ID?mid rdf:第一个?画布?中rdf:休息?最后一次。它是有效的。属性路径的主体似乎迭代地绑定到路径中的每个匹配对象。因此,当在构造中引用时,它显示一个类似于1-1、1-2、1-3、1-4、1-5的模式。我再次回到这个问题,发现查询没有返回列表的第一个rdf:first。e、 列表也有一个rdf:首先,这是一个重要的部分,因为json ld库需要识别列表头以重建序列。集合的构造具有以下语义:?list rdf:first?列表rdf:rest\uB1.\uB1:b1 rdf:首先。。。依此类推。@ChristopherJohnson提供的查询确实会获取列表中的第一个元素。关键在于?list rdf:rest*?mid.?中的属性路径?中间rdf:第一个?值。使用*这意味着?mid的一个值与?list相同,因此?value的一个值是列表中的第一个元素。因此,如果语法结构是elt*一个零次或多次出现的elt路径,而值?list只是:hasList的一个出现,那么?list也会出现rdf:rest,这似乎很奇怪,不是吗?令我疯狂的是,它确实在一个数据集上工作,而现在它不工作了,所以我不能肯定地说这是错误的。我目前的解决方法是首先获取?list rdf:rest节点,并将其用作查询中的静态构造值,以避免重复,还可以为?list rdf:first as?first添加一个变量。。。那么一切都可以正常工作。@Christopher当属性路径的长度为零时,就意味着开始和结束是同一个节点。所以?a p*?b与?a==?b匹配,即使没有使用属性p的三元组。快速跟进。我修复了数据中导致第一个元素丢失的问题。在元素的子节点子列表中,rdf:rest未设置为rdf:nil。如果没有这些rdf:nil tail语句,jsonld列表构造函数 不起作用。关于零的属性路径长度作为一个恒等属性,这是非常有趣和有用的,值得了解,并且被证实是正确的。谢谢