14

在这个简单的 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) }
4

6 回答 6

21

另一种变体是使用 BIND,例如:

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

BIND 语句只是为 ?m 添加一个绑定,然后可以为结果集选择它。

于 2016-02-14T19:11:11.687 回答
15

在 SPARQL 1.1 中,您可以为此使用VALUES 。你会写

SELECT ?v ?p ?m WHERE {
  values ?m { 42 }
  ?v ?p ?m
}
于 2014-03-03T22:47:09.160 回答
10

标准 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 表达式来进一步修剪结果。

于 2009-11-19T10:04:43.073 回答
3

您可以使用 BINDINGS 关键字和 FILTER 以两种方式完成

使用绑定

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

使用过滤器

SELECT ?v ?p ?m
WHERE {
?v ?p ?m
FILTER (?m = 42)
}
于 2017-01-03T16:33:02.823 回答
1
select ?v ?p ?m where { ?v ?p ?m . FILTER( ?m = 42 ) }
于 2009-11-20T11:01:55.257 回答
1

我知道这是迂回的,但我相信这可以通过子查询来实现。

这是一种有用的模式,可帮助您在整个数据集上放开查询之前在狭窄范围内处理查询:

SELECT ?v ?p ?m WHERE {
   { SELECT 42 as ?m WHERE { } }
   ?v ?p ?m .
}
于 2011-09-12T17:35:18.653 回答