【问题标题】:Bind Multiple SPARQL Variables into One将多个 SPARQL 变量绑定为一个
【发布时间】:2013-07-14 14:05:43
【问题描述】:

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

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

【问题讨论】:

    标签: sparql


    【解决方案1】:

    如果您有具体的值可用于?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" |
    -----------------
    

    【讨论】:

    • 谢谢,但如果已经绑定了变量,我想知道更多;我想我可以按照您对子查询的说明将绑定到 ?s1,2,3 的内容直接绑定到 ?s,但我可能需要保留 ?s1,2,3 的绑定并将它们放入?s。像上面那样做意味着失去不同的绑定。准备好被同化了吗?
    • @NargothBond 我想我理解你的意思,但我不太确定。你能否用一个你喜欢能够做什么的例子来更新你的问题,也就是说,一个你可以理想地编写的代码的例子(即使它实际上不合法)?从中我们可能能够更好地确定可以做些什么来模拟它。
    【解决方案2】:

    我认为您正确使用了 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)
            }
        }
    }
    

    【讨论】:

    • 再次感谢,请原谅,但您真的在测试这些吗?添加的数字绑定是无效的语法,并且似乎没有任何贡献。现在,我正在使用 Fuseki,所以这可能是问题所在。
    • 哎呀,我把 BIND 语句弄错了,把 VALUES 语句留在了那里。现在在芝麻下进行测试。对不起,如果我把你弄脏了。
    • 嗯......它似乎仍然没有绑定到 ?s.... 我可能会要求我的系统不可能。无论如何,我只需查询两次,就可能得到我需要的东西。感谢您的帮助。
    【解决方案3】:

    如果你能给出一个有效的例子会很有帮助。

    正如你所问的那样,我认为绑定是不可能的,因为绑定可以在任何时候绑定到单个实体。尽管我发现某些引擎缺少 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 输出中的单个“列”中。

    但是这种形式很糟糕,我建议您重新构建查询结构,这样就不需要这个“技巧”了。

    【讨论】:

    • 谢谢,但这似乎对我不起作用(我已经用代码编辑了我的问题来测试它)。我做错了什么,还是在我的系统上不起作用(Fuseki)?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    • 1970-01-01
    • 2013-01-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多