使用Python Neo4j-Embedded的极简Flask示例

3

我无法使用嵌入式Python绑定(neo4j / python-embedded,版本1.6)通过Flask微网络框架使用neo4j图形数据库实现一个可工作的最小示例。基于这个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数据库的指针,也许这是个不好的想法?)
1个回答

3

Neo4j嵌入式不适用于Web服务器环境——您应该使用Neo4j Server和Neo4j Server客户端。

Bulbs(http://bulbflow.com)是一个专为Flask设计的Neo4j Server客户端,事实上,bulbflow.com正在使用Flask在Heroku上运行,并使用Neo4j Heroku附加组件(目前免费)。

您可以使用Gremlin或Cypher进行查询和事务请求。

关于如何构建您的应用程序的示例,请参见Lightbulb(https://github.com/espeed/lightbulb)博客示例,特别是:

请注意,这是在bulbsconf.py中的一行:

bulbs_config.set_neo4j_heroku()

Lightbulb旨在与Neo4j Heroku Add On一起在Heroku上运行--如果您没有在Heroku上运行,则可以忽略该行。

然后,在您的Flask视图或app.py中执行以下操作:

from bulbsconf import graph

非常感谢您提供的有用提示和优美的“灯泡”示例。我一定会尝试使用Bulbs!我同意Neo4j嵌入式可能并不适合Web服务器使用...但是:也许这是可能的呢? - phynfo
如果您不将db放在g上,而只是设置db会发生什么? - espeed
你知道neo4j(服务器)的Bulbs是否支持事务吗?我知道Bulbs是按照Blueprint规范工作的,但我没有找到关于Blueprint和事务的任何信息。我知道neo4j REST不实现事务,所以我想知道Bulbs如何支持它。 - Ben G
Ben,请查看我在Gremlin用户组中回答你问题的答案: https://groups.google.com/d/msg/gremlin-users/HaznTd_8bG4/LzqhdXsdA00J - espeed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接