【问题标题】:INSERT DATA to Fuseki via Python SPARQLWrapper通过 Python SPARQLWrapper 向 Fuseki 插入数据
【发布时间】:2015-02-02 18:08:51
【问题描述】:

我正在与其他开发人员一起开发一个使用通用 Fuseki 数据集的应用程序。 Javascript 函数调用 AJAX (jQuery $.ajax()) 并通过 POST 请求向 Python 脚本发送三个变量。

Javascript:

$.ajax({
    url: 'py/registerUser.py',
    data: {firstname: registerFirstName, lastname: registerLastName, email: registerEmail},
    dataType: 'json',
    type: 'post',
    success: function(data) {
        if(data["result"] == "ok") {
            validSPARQL = true;
        }
        else {
            validSPARQL = false;
        }
    },
    error: function(data) {
        validSPARQL = false;
    }
});

Python 脚本检索 POST 变量并对其进行操作以创建查询字符串。然后将方法设置为 POST 并在给定地址上执行查询。

Python

#!/usr/bin/python
# -*- coding: utf-8 -*-

import cgi, cgitb, json, re
from SPARQLWrapper import SPARQLWrapper, JSON

arguments = cgi.FieldStorage()
firstname = arguments.getvalue('firstname')
lastname = arguments.getvalue('lastname')
email = arguments.getvalue('email')

queryString = """PREFIX aop:<http://vitali.web.cs.unibo.it/AnnOtaria/person/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf:<http://xmlns.com/foaf/0.1/>
INSERT DATA {
    aop:""" + firstname + lastname + """ a foaf:Person ;
    foaf:name \"""" + firstname + """ """ + lastname + """\" ;
    foaf:mbox <mailto:""" + email + """> .
}
"""

sparql = SPARQLWrapper("http://linktodataset.com:8181/data/update")
sparql.setQuery(queryString)
sparql.setReturnFormat(JSON)
sparql.setMethod('POST')
sparql.query()

print "Content-type: text/json\n"
print "{ \"result\": \"ok\" }"

我的问题:每次发送查询时,我都会收到 Internal Server Error 500。我尝试以多种方式操作代码,我按照this page 上的说明操作并查看了this other one 以及许多其他方法,其中包括 SPARQLWrapper 文档,但没有任何反应。

我尝试以其他方式编写查询字符串,导入其他库。没有任何效果。

注意 1: 注释行 sparql.query() 错误消失,但显然它没有发送任何查询。

注意 2:可以将 SELECT 查询发送到 http://linktodataset.com:8181/data/query,但这不适用于 INSERT DATA。

注意 3:我尝试了 Fuseki 控制面板上的查询字符串,以专用于 SPARQL 更新 的形式,它工作得很好。 SPARQL 查询表单中的相同查询不起作用。

我确定我做错了什么,但我不明白是什么……有什么建议吗?谢谢!

编辑 1(2015 年 2 月 9 日)

我已经编辑了查询字符串并尝试打印它,结果如下:

PREFIX aop:<http://mypersonallink.com/person/>
PREFIX rdf:<http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf:<http://xmlns.com/foaf/0.1/>
INSERT DATA {
aop:TestfirstTestlast a foaf:Person ;
foaf:name "Testfirst Testlast" ;
foaf:mbox <mailto:test@mail.com> .
}

编辑 2(2015 年 2 月 10 日)

我安装了本地 Fuseki 并使用 fuseki-server --update --mem /ds 启动它。地址是localhost:3030。 Python 代码几乎保持不变(mod_python 而不是 cgi,当然还有数据集的链接)。这是我得到的:

MOD_PYTHON ERROR

ProcessId:      13230
Interpreter:    '127.0.1.1'

ServerName:     '127.0.1.1'
DocumentRoot:   '/var/www/personal/html'

URI:            '/py/registerUser.py'
Location:       None
Directory:      '/var/www/personal/html/py/'
Filename:       '/var/www/personal/html/py/registerUser.py'
PathInfo:       ''

Phase:          'PythonHandler'
Handler:        'mod_python.cgihandler'

Traceback (most recent call last):

File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 1537, in HandlerDispatch
default=default_handler, arg=req, silent=hlist.silent)

File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 1229, in _process_target
result = _execute_target(config, req, object, arg)

File "/usr/lib/python2.7/dist-packages/mod_python/importer.py", line 1128, in _execute_target
result = object(arg)

File "/usr/lib/python2.7/dist-packages/mod_python/cgihandler.py", line 96, in handler
imp.load_module(module_name, fd, path, desc)

File "/var/www/personal/html/py/registerUser.py", line 37, in <module>
sparql.query()

File "/usr/lib/pymodules/python2.7/SPARQLWrapper/Wrapper.py", line 355, in query
return QueryResult(self._query())

File "/usr/lib/pymodules/python2.7/SPARQLWrapper/Wrapper.py", line 330, in _query
raise QueryBadFormed

QueryBadFormed: QueryBadFormed: a bad request has been sent to the endpoint, probably the sparql query is bad formed

注意最后一行:

QueryBadFormed: QueryBadFormed: a bad request has been sent to the endpoint, probably the sparql query is bad formed

好吧,我评论了sparql.query() 并打印了queryString,将其复制并放入SPARQL Update 可通过http://localhost:3030/sparql.tpl 访问的框中,效果很好。

【问题讨论】:

  • 您能否在构建请求后打印请求,并将其添加到问题中。您的查询字符串很容易无效,具体取决于名字和姓氏的值,但 我们 不知道这些值是什么。像这样的字符串连接(以及不受保护的插值)很容易导致语法错误(最好的情况)和 SPARQL 注入(最坏的情况)。
  • @JoshuaTaylor,抱歉耽搁了。我已经添加了您要求的内容。字符串对我来说似乎没问题,不是吗?
  • 另外,我更改了 Javascript,因为我需要发送一个包含三个变量(而不是两个)的 POST 请求(不再是 GET)。
  • 我已经添加了答案。
  • 澄清一下,SPARQLWrapper 是否声称支持 SPARQL 1.1 更新?浏览文档,我看到了有关 SPARQL 查询的信息,但没有看到 SPARQL 1.1 更新。如果 SPARQLWrapper 尝试解析更新或结果,如果它不支持 SPARQL 1.1 更新,它可能无法工作。

标签: javascript python semantic-web fuseki sparqlwrapper


【解决方案1】:

Fuseki 端点是否真的启用了“更新”?请注意,在文档 Fuseki: serving RDF data over HTTP 中,有一个 --update 选项:

  • --update
    允许更新。否则只处理读取请求(如果给出配置文件则忽略)。

那么,你也提到了:

注意 2:我可以将 SELECT 查询发送到 http://linktodataset.com:8181/data/query,但这不适用于 插入数据。

你不应该期望它会起作用。在我上面链接的同一文档中,我们看到了这个示例(注意应该发送查询和更新的 URL):

fuseki-server --update --mem /ds

使用内存数据集在端口 3030 上运行服务器。有可能 通过以下 URL 的适当协议访问:

  • SPARQL 查询:http://localhost:3030/ds/query
  • SPARQL 更新:http://localhost:3030/ds/update
  • SPARQL HTTP 更新:http://localhost:3030/ds/data

您的 INSERT DATA 是一个更新查询,需要发送到 http://linktodataset.com:8181/data/update 之类的地方。

【讨论】:

  • 我照你说的做了,但什么也没做。我将错误粘贴在我原来的帖子上。
【解决方案2】:

这是一个在 Fuseki 上工作的简单代码 (./fuseki-server --update)

sparql = SPARQLWrapper("http://127.0.0.1:3030/gptest/update")


sparql.setQuery("""
INSERT DATA {
<http://kook.com/a> <http://kook.com/b> <http://kook.com/c>.
}
""")
sparql.method
sparql.setReturnFormat(JSON)
results = sparql.query().convert()


print(results)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-21
    • 2016-12-22
    • 1970-01-01
    • 2021-01-28
    • 2020-10-31
    • 1970-01-01
    • 2019-04-15
    • 2013-05-31
    相关资源
    最近更新 更多