RDFlib с Fuseki очень медленно выполняет запросы на локальном сервере

У меня есть небольшое приложение wsgi, на котором запущен локальный сервер Cherry, и я использую RDFlib для преобразования запросов на человеческом языке в запросы SPARQL для запроса файла ttl, загруженного в fuseki. Он работает, но невероятно медленно! Предыдущая версия этого скрипта принимала запросы SPARQL напрямую, поэтому я не использовал RDFlib, и это работало очень быстро! Что-то не так с тем, как я использую RDFlib, что делает его таким медленным?

from abc import ABCMeta, abstractmethod, abstractproperty
from collections import OrderedDict
from threading import Thread
from time import sleep
from cherrypy import engine
from cherrypy.wsgiserver import CherryPyWSGIServer
from werkzeug.wsgi import DispatcherMiddleware
from werkzeug.debug import DebuggedApplication
from werkzeug.wsgi import SharedDataMiddleware
from werkzeug.wrappers import Response, Request
from requests import get, post, RequestException
from jinja2 import Environment, FileSystemLoader
import os
from SPARQLWrapper import SPARQLWrapper, JSON
import rdflib


__author__ = 'authorname'

templates_dir = os.path.abspath('templates')
static_dir = os.path.abspath('static')

class RdfDemoApp(object):
    def __init__(self, sparql_endpoint_address):
        self._sparql_endpoint_address = sparql_endpoint_address
        self._jinja_env = Environment(loader=FileSystemLoader(templates_dir), autoescape=True)

    def render_template(self, template, **params):
        t = self._jinja_env.get_template(template)
        return t.render(params)

    def _app(self, environ, start_response):
        request = Request(environ)
        if 'query' in request.args.keys():
            query_string = "'"+request.args['query']+"'"
            print query_string

            results = g.query("""PREFIX pers: <http://blabla.com/Register/schemas/persons/>
            SELECT ?person ?sibling ?sibforname
            WHERE { 
               ?person pers:name ?name .
                 ?name  pers:forename """+query_string+""" .
                ?person pers:siblingOf ?sibling .
                ?sibling pers:name ?sibname .
                ?sibname pers:forename ?sibforname .
                 ?sibname pers:type "std"  } """)#, format = "JSON")
            for row in results:
                print row
            header = []
            i=0
            for item in results:
                while i in range(len(item)):
                    for x in item:
                        header.append(x)
                        i+=1
            quer = query_string
            response = Response(self.render_template('results_rdf.html', results=results, header = header, query = quer, static_dir = static_dir ), mimetype='text/html')

        else:
            response = Response(self.render_template('form_rdf.html'), mimetype='text/html')

        return response(environ, start_response)

    def __call__(self, environ, start_response):
        app = SharedDataMiddleware(DebuggedApplication(self._app, evalex=True), {
            '/static': static_dir
        })
        return app(environ, start_response)

if __name__ == '__main__':
    g=rdflib.Graph()
    g.parse("/Users/username/Documents/pers_file_new.ttl", format='n3')
    wsgi_app = RdfDemoApp("http://localhost:3030/ds/query")
    try:
        server = CherryPyWSGIServer(('127.0.0.1',10001), wsgi_app)
        server.start()

    except KeyboardInterrupt:
        server.stop()
        print "Logged out"

person user3241376    schedule 14.01.2015    source источник
comment
Тот же вопрос, что и answers.semanticweb.com/questions/31334/   -  person AndyS    schedule 14.01.2015
comment
и пока нет ответа. Я разместил это здесь, а также для лучшей наглядности.   -  person user3241376    schedule 14.01.2015
comment
@user3241376 user3241376 Кросспостинг — это нормально, но это хороший этикет, чтобы сообщить нам об этом; таким образом, мы могли бы просмотреть ответы там, чтобы увидеть, что на него уже был дан ответ, или чтобы другие, кто найдет этот вопрос и нуждается в ответе, могли искать его в другом месте. Stack Overflow разработан, чтобы быть полезным всем, кто находит вопрос, а не только тому, кто его задал.   -  person Joshua Taylor    schedule 14.01.2015
comment
Должен ли я был поставить ссылку на сообщение semweb, чтобы вы знали? Если да, то я сделаю это в следующий раз. Пока удалил пост semweb, ответов все равно не было.   -  person user3241376    schedule 15.01.2015


Ответы (1)


Я не уверен, насколько велик ваш набор данных в pers_file_new.ttl, но одна из причин его медленности заключается в том, что вы считываете все это в память с помощью RDFLib.

g.parse("/Users/username/Documents/pers_file_new.ttl", format='n3')

С вашим текущим кодом вы запрашиваете не Fuseki, а граф RDFlib в памяти. Вы можете последовать примеру с домашней страницы SPARQLWrapper. Это довольно близко к тому, что вы пытаетесь сделать.

http://rdflib.github.io/sparqlwrapper/

person Ted Lawless    schedule 15.01.2015
comment
мой файл черепашки совсем не большой, около 80000 троек. Я предполагал, что использую график g отдельно от fuseki, хотя мой Fuseki тоже работает с точно такими же загруженными данными. Я не понимаю, как я могу использовать RDFlib для этих данных Fuseki вместо того, чтобы загружать их в отдельный граф g. - person user3241376; 15.01.2015
comment
Не похоже, что вам нужен RDFLib для вашего примера. Вы можете просто подключиться к Fuseki напрямую через HTTP, используя SPARQLWrapper. См. пример на странице SPARQLWrapper, чтобы начать работу. - person Ted Lawless; 15.01.2015