Минимальный пример Flask с использованием Python Neo4j-Embedded

Мне не удалось реализовать работающий минимальный пример с помощью Python Micro-Webframework Flask с использованием графической базы данных neo4j через встроенные привязки python (neo4j/python-embedded, версия 1.6). Что у меня есть (на основе этого Stack-Overflow-thread):

import os
import jpype
from neo4j import GraphDatabase
from flask import Flask, g

# configuration
DATABASE = 'graphdatabase'
DEBUG = True
SECRET_KEY = 'blubber'
USERNAME = 'tobias'
PASSWORD = 'bla'
ADMIN = 'admin'

app = Flask(__name__)
app.config.from_object(__name__)

def connectDB(): 
    return GraphDatabase(app.config['DATABASE'])

def initDB():
    db = connectDB()
    with db.transaction:
        users = db.node()
        userIndex = db.node.indexes.create('users')
        user = db.node(name=app.config['ADMIN'])
        userIndex['name'][app.config['ADMIN']] = user
    db.shutdown()
    print "Database initialized."

@app.before_request
def before_request():
    jpype.attachThreadToJVM()
    g.db = connectDB()

@app.teardown_request
def teardown_request(exception):
    jpype.attachThreadToJVM()
    g.db.shutdown()

@app.route('/')
def index():
    with g.db.transaction:
          userIndex = g.db.node.indexes.get('users')
          user = userIndex['name'][app.config['ADMIN']].single
          username = user['name']
    return render_template('index.html', name=username)

if os.path.exists(app.config['DATABASE']) == False:
    initDB()

if __name__ == '__main__':
  app.run()

К сожалению, выдает:

    File "/home/tobias/Esk/Dev/adhocracyLight/venv/lib/python2.7/site-packages/flask/app.py", line 1518, in __call__
return self.wsgi_app(environ, start_response)
File "/home/tobias/Esk/Dev/adhocracyLight/venv/lib/python2.7/site-packages/flask/app.py", line 1506, in wsgi_app
response = self.make_response(self.handle_exception(e))
File "/home/tobias/Esk/Dev/adhocracyLight/venv/lib/python2.7/site-packages/flask/app.py", line 1504, in wsgi_app
response = self.full_dispatch_request()
File "/home/tobias/Esk/Dev/adhocracyLight/venv/lib/python2.7/site-packages/flask/app.py", line 1264, in full_dispatch_request
rv = self.handle_user_exception(e)
File "/home/tobias/Esk/Dev/adhocracyLight/venv/lib/python2.7/site-packages/flask/app.py", line 1262, in full_dispatch_request
rv = self.dispatch_request()
File "/home/tobias/Esk/Dev/adhocracyLight/venv/lib/python2.7/site-packages/flask/app.py", line 1248, in dispatch_request
return self.view_functions[rule.endpoint](**req.view_args)
File "/home/tobias/Esk/Dev/adhocracyLight/adhocracyLight.py", line 73, in index
userIndex = g.db.node.indexes.get('users')
File "/home/tobias/Esk/Dev/adhocracyLight/venv/lib/python2.7/site-packages/neo4j/index.py", line 36, in get
return self._index.forNodes(name)
java.lang.RuntimeExceptionPyRaisable: java.lang.IllegalArgumentException: No index provider 'lucene' found. Maybe the intended provider (or one more of its dependencies) aren't on the classpath or it failed to load.

Я предполагаю, что проблема связана с многопоточностью (g является локальным потоком и содержит указатель на базу данных neo4j, может быть, это плохая идея?).


person phynfo    schedule 02.06.2012    source источник


Ответы (1)


Neo4j Embedded не предназначен для использования в среде веб-сервера — вы должны использовать Neo4j Server и клиент Neo4j Server.

Bulbs (http://bulbflow.com) — это серверный клиент Neo4j, разработанный с учетом Flask, а именно bulbflow. com работает на Flask на Heroku с использованием надстройки Neo4j Heroku (которая в настоящее время бесплатна).

Вы используете Gremlin или Cypher для запросов и транзакционных запросов.

Пример того, как структурировать ваше приложение, см. в Lightbulb (https://github.com/espeed/lightbulb) пример блога, особенно:

Обратите внимание на эту строку в bulbsconf.py:

bulbs_config.set_neo4j_heroku()

Lightbulb предназначен для работы на Heroku с надстройкой Neo4j Heroku — оставьте эту строку, если вы не работаете на Heroku.

Затем в представлениях Flask или app.py выполните:

from bulbsconf import graph
person espeed    schedule 02.06.2012
comment
Большое спасибо за полезные советы и элегантный пример лампочки. Обязательно попробую лампочки! И я согласен с тем, что встроенный Neo4j, вероятно, не предназначен для использования веб-сервером ... но: возможно, это возможно? - person phynfo; 03.06.2012
comment
Что произойдет, если вы не поместите db в g, а просто установите db? - person espeed; 03.06.2012
comment
Знаете ли вы, поддерживают ли лампочки с neo4j (сервером) транзакцию? Я знаю, что лампочка работает со спецификацией чертежа, но я ничего не нашел о чертежах и транзакциях. Я знаю, что neo4j REST не реализует транзакцию, поэтому мне интересно, как лампа может ее поддерживать. - person Ben G; 05.11.2012
comment
Бен, см. мой ответ на ваш вопрос в группе пользователей Gremlin: группы. google.com/d/msg/gremlin-users/HaznTd_8bG4/LzqhdXsdA00J - person espeed; 06.11.2012