将多个SPARQL变量绑定到一个

将多个SPARQL变量绑定到一个,sparql,Sparql,有没有办法做到这一点: BIND((?s1, ?s2, ?s3) AS ?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((?s1, ?s2, ?s3) AS ?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)
    }
  }
}

如果您有用于?s的具体值,那么可以在SPARQL 1.1中使用。如果您没有具体的值,那么您仍然可以这样做,如果您可以构造查询,使?s由子查询生成。我将使用以下数据分别给出一个示例:

@prefix : <http://example.org/> .

:t :hasEss :s1, :s2, :s3  .
:s1 :value "larry" .
:s2 :value "curly" .
:s3 :value "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" |
-----------------

如果你能举一个有效的例子,那会很有帮助

正如您所问,我认为这是不可能的,因为绑定可以在任何时候绑定到单个实体。尽管我发现某些引擎缺少价值观支持,但之前的海报给出了极好的响应。在没有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输出中的一列中


然而,这是一种糟糕的形式,我建议您重新构造查询,这样就不必使用这种“技巧”。

我认为您正确地使用了VALUES关键字,但我怀疑您的引擎中有一个缺点。你在用芝麻吗

但是,您可以通过再次使用绑定和联合来解决这个问题

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

谢谢,但我想知道更多的情况下,有变量已经绑定;我想我可以按照您在子查询中所说的那样,将绑定到?s1,2,3的内容直接绑定到?s,但我可能需要保留?s1,2,3的绑定,并将它们保存在?s中。这样做意味着丢失不同的绑定。准备被同化吗?@NargothBond我想我明白你的意思,但我不太确定。你能不能用一个你想做什么的例子来更新你的问题,也就是说,一个你可以理想地编写的代码的例子,即使它实际上并不合法?因此,我们可以更好地确定可以做什么来模拟它。谢谢,但这似乎对我不起作用。我已经用代码编辑了我的问题来测试它。我是做错了什么,还是我的Fuseki系统无法正常工作?再次感谢,请原谅,但你真的在测试这些吗?添加的带有数字的绑定是无效语法,似乎没有任何作用。现在,我正在使用Fuseki,所以这可能是问题所在。哎呀,我用错误的方法得到BIND语句,并将VALUES语句留在那里。这是在芝麻下测试的。对不起,如果我打扰了你。嗯。。。它似乎仍然没有绑定到?s。。。。我可能会要求我的系统不可能。无论如何,我只需要查询两次就可以得到我需要的东西。谢谢你的帮助。
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)
        }
    }
}