有没有办法做这样的事情:
BIND((?s1, ?s2, ?s3) AS ?s)
这样对?s的查询会被分发到列表中吗?
修改
顺便说一句,似乎以下不起作用。我做错了吗?SELECT *
WHERE
{
VALUES (?s1 ?s2 ?s3) {(1 4 7) (2 5 8) (3 6 9)} .
{
{
BIND(?s1 AS ?s)
}
union
{
BIND(?s2 AS ?s)
}
union
{
BIND(?s3 AS ?s)
}
}
}
答案 0 :(得分:12)
如果您具有用于?s
的具体值,那么您可以在SPARQL 1.1中VALUES。如果您没有具体的值,那么如果您可以构建查询以便子查询生成?s
,那么您仍然可以执行此操作。我将使用以下数据给出每个示例:
@prefix : <http://example.org/> .
:t :hasEss :s1, :s2, :s3 .
:s1 :value "larry" .
:s2 :value "curly" .
:s3 :value "moe" .
VALUES
VALUES
指定一个或多个变量的固定值。
prefix : <http://example.org/>
select * where {
values ?s { :s1 :s2 :s3 }
?s :value ?value
}
$ arq --data data.n3 --query values.query
-----------------
| s | value |
=================
| :s1 | "larry" |
| :s2 | "curly" |
| :s3 | "moe" |
-----------------
我们这里只使用一个(?s
),但语法也支持更多,所以将来如果你需要它,你也可以做
values (?x ?y) { (:x1 :y1) (:x2 :y2) ... }
您还可以编写一个子查询来查找?s
的值,然后超级查询将使用这些结果。
prefix : <http://example.org/>
select * where {
{
select ?s where {
:t :hasEss ?s
}
}
?s :value ?value
}
$ arq --data data.n3 --query subquery.sparql
-----------------
| s | value |
=================
| :s3 | "moe" |
| :s2 | "curly" |
| :s1 | "larry" |
-----------------
答案 1 :(得分:1)
我认为你正确使用了VALUES关键字,但我怀疑你的引擎有一个短暂的问题。你在用SESAME吗?
但是你可以使用BIND和UNION(再次!)
来解决它SELECT *
WHERE
{
{
BIND(1 as ?s1)
BIND(4 as ?s2)
BIND(7 as ?s3)
}
union
{
BIND(2 as ?s1)
BIND(5 as ?s2)
BIND(8 as ?s3)
}
union
{
BIND(3 as ?s1)
BIND(6 as ?s2)
BIND(9 as ?s3)
}
{
{
BIND(?s1 AS ?s)
}
union
{
BIND(?s2 AS ?s)
}
union
{
BIND(?s3 AS ?s)
}
}
}
答案 2 :(得分:0)
如果你能提供一个有用的例子,那会很有帮助。
正如您所说的那样,我认为不可能因为任何时候绑定都可以绑定到单个实体。之前的海报给出了很好的回应,尽管我发现在某些引擎中缺少VALUES支持。在没有VALUES关键字的情况下编写查询的另一种方法是使用UNION。
select ?s {
# some query that results a binding to ?s1 ?s2 and \ or ?s3
{
BIND(?s1 AS ?s)
}
union
{
BIND(?s2 AS ?s)
}
union
{
BIND(?s3 AS ?s)
}
}
这会将?s1?s2和?s3的结果合并到sparql输出中的单个“列”中。
然而,这种形式很糟糕,我建议您重新构建查询,以便不需要这个“技巧”。