12

有没有办法做这样的事情:

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)
    }
  }
}
4

3 回答 3

13

如果您有具体的值用于 for ?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" |
-----------------
于 2013-07-16T13:50:14.047 回答
1

我认为您正确使用了 VALUES 关键字,但我怀疑您的引擎存在缺陷。你在用芝麻吗?

但是,您可以通过使用 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)
        }
    }
}
于 2013-07-18T07:32:01.200 回答
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 输出中的单个“列”中。

然而,这是一种糟糕的形式,我建议您重组您的查询,这样就不需要这个“技巧”了。

于 2013-07-17T15:56:06.210 回答