我创建了一个 SPARQL 查询来检索有关工作流元素的大量信息。查询与数据库对话并从 Python 调用。查询的形式如下:
"""SELECT ?input ?value1 ?value2 ?value3 ....
WHERE {?input rdf:type InputVar.
?input property1 ?value1.
?input property2 ?value2.
?input property3 ?value3.
.... etc....
}"""
此查询将返回与我想知道的属性对应的所有值。
我现在希望我的查询能够做的是我希望它能够查找所有输入变量(就像现在一样)并且我希望它能够收集一个指定输入的信息.这样做是可能的:
%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 中的某种准备/参数化查询支持?
看看What's the best way to parameterise SPARQL queries其中讨论了如何在各种 API 中执行此操作。
自从你提到 Python answer using Python可能特别感兴趣,它基于 prepared queries 的示例来自 RDFLib 文档
关于python - 如何在 SPARQL 查询中预定义变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28217801/