如何在SPARQL查询中预定义变量

时间:2015-01-29 15:01:29

标签: python sparql

我创建了一个SPARQL查询来检索有关工作流元素的大量信息。查询与数据库进行通信,并从Python调用。查询的形式如下:

"""SELECT ?input ?value1 ?value2 ?value3 ....
WHERE {?input rdf:type InputVar.
?input property1 ?value1.
?input property2 ?value2.
?input property3 ?value3.
.... etc....
}"""

然后,此查询将返回与我想要知道的属性对应的所有值。

我现在希望我的查询能够做到的是我希望它能够同时查找所有输入变量(就像现在一样)并且我希望它能够收集ONE的信息,指定的输入。这可能是这样的:

%s property1 ?value1
%s property2 ?value2

我会让%s,取决于是否指定了名称,是?input或inputname(指定的名称)。

但是,如果我这样做,我需要很多%s,因为我提取了很多属性。

在SPARQL中,是否可以定义要查找的变量的名称?那么可以这样做吗?

    """SELECT ?input ?value1 ?value2 ?value3 ....
    WHERE {(?input=inputname)
    ?input rdf:type InputVar.
    ?input property1 ?value1.
    ?input property2 ?value2.
    ?input property3 ?value3.
    .... etc....
    }"""

所以在开头添加类似(?input = inputname)的东西,所以它只查找这个值?

1 个答案:

答案 0 :(得分:3)

在一般情况下,您可以尝试使用VALUES子句,例如

SELECT *
WHERE 
{
  VALUES ?input { <http://myConstant> }
  ?input rdf:type InputVar.
  ?input property1 ?value1.
  ?input property2 ?value2.
  ?input property3 ?value3.
  # etc.
}

然而,重要的是要明白这实际上并不是你想要的直接。从语义上讲,它将常量加入到图形模式的匹配中,从而消除了?input与常量不匹配的匹配。一些查询引擎可能足够聪明,可以将其简化为替换,但并非所有查询引擎都能够进行替换,并且只适用于相对简单的查询。

听起来你真的在使用大多数SQL API中的某种准备/参数化查询支持?

查看What's the best way to parameterise SPARQL queries,讨论如何在各种API中执行此操作。

由于您提到Python,answer using Python可能特别感兴趣,它基于RDFLib文档中prepared queries的示例