Я новичок в SPARQL и Fuseki.Я настроил Fuseki Server с помощью
fuseki-server --update --mem /address_act
для создания набора данных.
И у меня есть график, содержащий много триплетов, и затем я хочу добавить эти триплеты в набор данных через SPARQLUPDATE.Вот код для получения тройки в граф и попытки сохранить его в наборе данных через сервер Fuseki:
import requests
import rdflib
import re
from rdflib import ConjunctiveGraph, Graph, Literal, URIRef
from rdflib.plugins.stores import sparqlstore
query_endpoint = 'http://localhost:3030/address_act/query'
update_endpoint = 'http://localhost:3030/address_act/update'
store = sparqlstore.SPARQLUpdateStore()
store.open((update_endpoint, update_endpoint))
default_graph = URIRef('http://example.org/default-graph')
ng = Graph(store, identifier=default_graph)
g = Graph()
g1 = Graph()
for i in range(1,2):
url = 'http://gnafld.net/address/?per_page=3&page=' + str(i)
g.parse(url)
page = g.query("""SELECT ?subject
WHERE {
?subject a <http://gnafld.net/def/gnaf#Address>.
}""")
for row in page:
ad_info = requests.get(row.subject).content
g1.parse(data=ad_info, format='turtle')
#print('The number of triples in Graph: {}'.format(len(g1)))
ng.update(
u'INSERT DATA { %s }' % g1.serialize(format='turtle')
)
Кроме того, у меня есть другой способ сделать это с помощью SPARQLWrapper:
import requests
import rdflib
import re
from rdflib import ConjunctiveGraph, Graph, Literal, URIRef
from rdflib.plugins.stores import sparqlstore
from SPARQLWrapper import SPARQLWrapper
query_endpoint = 'http://localhost:3030/address_act/query'
update_endpoint = 'http://localhost:3030/address_act/update'
store = sparqlstore.SPARQLUpdateStore()
store.open((update_endpoint, update_endpoint))
default_graph = URIRef('http://example.org/default-graph')
g = Graph()
g1 = Graph(identifier=default_graph)
for i in range(1,2):
url = 'http://gnafld.net/address/?per_page=3&page=' + str(i)
g.parse(url)
page = g.query("""SELECT ?subject
WHERE {
?subject a <http://gnafld.net/def/gnaf#Address>.
}""")
for row in page:
ad_info = requests.get(row.subject).content
g1.parse(data=ad_info, format='turtle')
#print('The number of triples in Graph: {}'.format(len(g1)))
for s,p,o in g1:
queryStringUpload = 'INSERT DATA {GRAPH <http://example.org/default-graph> {%s %s %s}}' %(s,p,o)
sparql = SPARQLWrapper('http://localhost:3030/address_act/update')
sparql.setQuery(queryStringUpload)
sparql.method = 'POST'
sparql.query()
Когда я запускаю два приведенных выше, последнее предложение ng.update(u'INSERT DATA { %s }' % g1.serialize(format='turtle'))
и sparql.query()
в программе вызывает ошибку.Я уверен, что эти тройки существовали на графике, но когда происходит обновление, оба выдают ошибку вроде:
QueryBadFormed: QueryBadFormed: a bad request has been sent to the endpoint, probably the sparql query is bad formed.
Response:
b'Error 400: Lexical error at line 11, column 59. Encountered: "\\\'" (39), after : "b"\n\n\nFuseki - version 3.7.0 (Build date: 2018-04-05T11:04:59+0000)\n'
и ошибку типа:
QueryBadFormed: QueryBadFormed: a bad request has been sent to the endpoint, probably the sparql query is bad formed.
Response:
b'Error 400: Line 1, column 56: Unresolved prefixed name: http:\n\n\nFuseki - version 3.7.0 (Build date: 2018-04-05T11:04:59+0000)\n'
Кажется, что обновление SPARQLоперация не работает.Есть ли грамматическая ошибка, так что тройки не могут быть вставлены?Есть идеи, как это решить?Благодарен за любые усилия.