在这个简单的Sparql查询中,我得到了一个对象为42的主题列表

SELECT ?v WHERE { ?v ?p 42 }

如果我添加?p作为变量

SELECT ?v ?p WHERE { ?v ?p 42 }

我将获得每个行的两个实体,即主题和谓词。如果我想要三个实体,那么包括42个实体怎么办?就像是:

SELECT ?v ?p ?m WHERE { ?v ?p (42 as m) }
有帮助吗?

解决方案

标准SPARQL 1.0并不能真正允许。不过,可能会有一些特定于实现的扩展。

作为解决方法,如果数据包含一个以42作为对象字面的三倍,则可以这样做:这样:

SELECT ?v ?p ?m { ?v ?p 42, ?m FILTER(?m=42)}

等效于

 SELECT ?v ?p ?m WHERE { ?v ?p 42 . ?v ?p ?m FILTER(?m=42)}

您可以编写图形模式,与逗号对象列表符号共享相同的主题和谓词,以及 WHERE 关键字是可选的。

为了提高效率,您需要使用基本的图形模式将工作三重量减少到较小的集合,然后才能应用滤波器表达式以进一步修剪结果。

其他提示

另一个变体是使用绑定,例如:

SELECT ?v ?p ?m
WHERE {
  BIND(42 AS ?m)
  ?v ?p ?m
}

绑定语句简单地添加了绑定?m,然后可以为结果集选择哪个绑定。

在SPARQL 1.1中,您可以使用 为了这。你会写的

SELECT ?v ?p ?m WHERE {
  values ?m { 42 }
  ?v ?p ?m
}

您可以使用绑定关键字和过滤器以两种方式完成

使用绑定

SELECT ?v ?p ?m 
WHERE { ?v ?p ?m}
BINDINGS ?m {(42)}

使用过滤器

SELECT ?v ?p ?m
WHERE {
?v ?p ?m
FILTER (?m = 42)
}
select ?v ?p ?m where { ?v ?p ?m . FILTER( ?m = 42 ) }

我知道这是圆形的,但我相信这可以通过一个子查询可行。

这是一个有用的模式,可帮助您在狭窄的查询中处理查询,然后再放在整个数据集中:

SELECT ?v ?p ?m WHERE {
   { SELECT 42 as ?m WHERE { } }
   ?v ?p ?m .
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top