在这个简单的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) }
答案 0 :(得分:11)
另一种变体是使用BIND,例如:
SELECT ?v ?p ?m
WHERE {
BIND(42 AS ?m)
?v ?p ?m
}
BIND语句只是为?m添加一个绑定,然后可以为结果集选择它。
答案 1 :(得分:8)
标准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
关键字是可选的。
为了提高效率,您希望使用基本图形模式将工作三元组减少到较小的集合,然后才应用FILTER表达式来进一步修剪结果。
答案 2 :(得分:8)
在SPARQL 1.1中,您可以使用VALUES。你会写
SELECT ?v ?p ?m WHERE {
values ?m { 42 }
?v ?p ?m
}
答案 3 :(得分:1)
select ?v ?p ?m where { ?v ?p ?m . FILTER( ?m = 42 ) }
答案 4 :(得分:1)
您可以使用BINDINGS关键字和FILTER
以两种方式完成使用BINDINGS
SELECT ?v ?p ?m
WHERE { ?v ?p ?m}
BINDINGS ?m {(42)}
使用FILTER
SELECT ?v ?p ?m
WHERE {
?v ?p ?m
FILTER (?m = 42)
}
答案 5 :(得分:0)
我知道这是圆形的,但我相信这对于子查询是可行的。
这是一个有用的模式,可以帮助您在狭义中处理查询,然后再放宽整个数据集:
SELECT ?v ?p ?m WHERE {
{ SELECT 42 as ?m WHERE { } }
?v ?p ?m .
}