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

How can you predefine a variable in a SPARQL query

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

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

此查询将 return 向我提供与我想知道的 属性 对应的所有值。

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

%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)的东西,所以它只查找这个值?

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

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

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

听起来您真的在寻求大多数 SQL API 中的某种 prepared/parameterized 查询支持?

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

自从您提到 Python RDFLib 文档中的 answer using Python may be of particular interest which is based off an example of prepared queries