我需要测试某些SPARQL
查询是否确实是INSERT
或DELETE
语句。因此,我一直在使用不同的解析器(主要是fyzz
和SPARQLWrapper
),如下所示:
try:
sparql = parse(Query_String)
except Exception as e:
raise ContentsUnacceptable(
" The query attribute does not conform to the SPARQL query syntax !!")
和:
try:
sparql = SPARQLWrapper("local/graph/file")
sparql.setQuery(Query_String)
results = sparql.query().convert()
except Exception as e:
raise ContentsUnacceptable(
" The query does not conform to the SPARQL query syntax !!")
我的两个代码都适用于SELECT
语句,但只要我尝试INSERT
或DELETE
语句,我就会在代码"The query does not conform to the SPARQL query syntax !!"
上写入异常这可能意味着解析器无法识别INSERT和DELETE语句。根据我的研究,主要有两个用于SPARQL查询的解析器。有没有办法让fyzz和SPARQLWrapper解析器识别这些语句?
答案 0 :(得分:0)
SPARQLWrapper实际上并不打算作为SPARQL解析器。它所做的就是充当SPARQL端点服务的客户端--AFAICT查询字符串的实际解析由端点本身完成。
在您的特定示例中,您将SPARQLWrapper指向一个本地文件,因为本地文件不是SPARQL端点,所以该文件根本无法工作。在 指向SPARQL端点的尝试中,该端点不接受SPARQL更新(因为可以理解的是,他们不允许远程客户端更新其数据)。
如果您希望坚持使用SPARQLWrapper,(非常笨重)解决方案将是设置您自己的SPARQL端点服务,将其配置为允许远程更新,然后使用该端点验证您的查询/更新(有大量免费的SPARQL端点实现,包括RDF4J Server和Jena Fuseki,仅举两个流行的实例)。
但是如上所述,这是一个笨重的解决方案:如果您的目标只是解析字符串以验证其语法,那么您应该在Python中使用实际的SPARQL解析器。 RDFLib's SPARQL Parser在这里可能是一个不错的选择。我不是Python专家,但我想到了以下几点:
import rdflib.plugins.sparql.parser
parser.parseQuery("SELECT ...")
和
parser.parseUpdate("INSERT ...")
可以帮到你。