SPARQLWrapper - Соединение RDFLib с сервером Fuseki - PullRequest
0 голосов
/ 22 мая 2018

Я новичок в 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операция не работает.Есть ли грамматическая ошибка, так что тройки не могут быть вставлены?Есть идеи, как это решить?Благодарен за любые усилия.

...