题
在这个简单的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 .
}
不隶属于 StackOverflow