我正在开发一个与其他开发人员一起使用通用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\" }"我的问题是:每次发送查询时,我都会得到一个内部服务器错误500。我试图以多种方式操作代码,我遵循了此页上的说明,查看了另一个和许多其他方面,其中包括SPARQLWrapper文档,但什么也没有发生。
我尝试以其他方式编写查询字符串,导入其他库。什么都没用。
注释1:注释行sparql.query()错误消失,显然它不会发送任何查询。
备注2: --我可以向http://linktodataset.com:8181/data/query发送SELECT查询,但这不适用于INSERT数据。
注释3: --我尝试了Fuseki上的查询字符串,其形式是专门用于SPARQL的,它工作得很好。SPARQL查询表单中的相同查询没有工作。
我肯定我做错了什么,但我不明白.有什么建议吗?谢谢!
编辑1(09-2015年2月)
我编辑了查询字符串,并尝试打印它,结果是:
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(10-2015年2月-2015年)
我安装了本地的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,复制了它,并将它放到了http://localhost:3030/sparql.tpl可访问的SPARQL Update框中,它运行得很好。
发布于 2015-02-09 17:30:19
Fuseki端点实际上启用了“更新”吗?注意,在文档Fuseki:通过HTTP提供RDF数据中,有一个-update选项:
--update
允许更新。否则,只提供读取请求(如果给出配置文件,则忽略)。然后,你还提到:
注2:我可以向http://linktodataset.com:8181/data/query发送SELECT查询,但这不适用于INSERT数据。
你不应该指望它能起作用。在我链接到的相同的文档中,我们看到了这个例子(请注意应该发送查询和更新的URL):
fuseki-服务器-更新-mem /ds 使用内存数据集在端口3030上运行服务器.它可以通过适当的协议在以下网址访问:
http://localhost:3030/ds/queryhttp://localhost:3030/ds/updatehttp://localhost:3030/ds/data插入数据是一个更新查询,需要发送到类似于http://linktodataset.com:8181/data/update的内容。
发布于 2015-07-24 21:10:15
这是一个在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)https://stackoverflow.com/questions/28284002
复制相似问题