Error[8]: Trying to access array offset on value of type null, File: /www/wwwroot/outofmemory.cn/tmp/model_misc.func.php, Line: 1274
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 190, wqo_prev_next_read(734231)
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Error[8]: Trying to access array offset on value of type null, File: /www/wwwroot/outofmemory.cn/tmp/model_misc.func.php, Line: 1275
File: /www/wwwroot/outofmemory.cn/tmp/route_read.php, Line: 190, wqo_prev_next_read(734231)
File: /www/wwwroot/outofmemory.cn/tmp/index.inc.php, Line: 166, include(/www/wwwroot/outofmemory.cn/tmp/route_read.php)
File: /www/wwwroot/outofmemory.cn/index.php, Line: 30, include(/www/wwwroot/outofmemory.cn/tmp/index.inc.php)
Django框架使用Neomodel、django_python_内存溢出

Django框架使用Neomodel、django

Django框架使用Neomodel、django,第1张

文章目录
    • 1、问题
    • 2、解决
    • 3、最终

1、问题

  这个问题整整困扰了我两天,国内的博客基本都是一笔带过,要不就是用py2neo。py2neo我自己写独立脚本是读写数据进入Neo4j都是没有问题的。后来我把github上面的Django+Neo4j的项目基本开了个遍,也详细看了neomodel和django_model的官方文档和示例。但是都没有得到解决。
  最初,我通过Neo4j官网上的Using Neo4j from Python寻找Neo4j通过Python连接的方案,文末提到了好几个方案。其中包括:

  1. Py2neo
  2. neomodel
  3. django_model
  4. neo4django
  5. etc

  因为neo4django支持neo4j的版本实在太低了,而且应该这个包暂时应该不维护了,所以我排除了4。而django_model是个插件,一般和neomodel结合。经过调研,我决定采用neomodel+django_model。
  出现这个返回空数组的bug之后,接着我通过英文在国际版的bing搜索,结果寥寥。主要参考的还是github上给出的项目实例。我推荐看一下这个项目:A simple Django web app for searching the Paradise Papers dataset backed by Neo4j。

此外,我再在github推荐两个项目/官方包:
1、neo4j-movies-python-neomodel
2、django-neomodel

2、解决

  过程很折磨,大概也能想到之后科研之路的不平坦吧。得好好坐冷板凳。
  其实我很早就想到setiting路径的问题,一直感觉是没有访问到数据库。看大部分的代码,都是这样给的:

# Connect to Neo4j Database
config.DATABASE_URL = 'bolt://neo4j的用户名:neo4j的密码@本机ip地址:端口号'
config.ENCRYPTED_CONNECTION = True
config.MAX_POOL_SIZE = 50
config.AUTO_INSTALL_LABELS = False
NEOMODEL_SIGNALS = True

或者是

NEOMODEL_NEO4J_BOLT_URL = os.environ.get('NEO4J_BOLT_URL', 'bolt://neo4j:123456@localhost:7687')
NEOMODEL_SIGNALS = True
NEOMODEL_FORCE_TIMEZONE = False
NEOMODEL_ENCRYPTED_CONNECTION = True
NEOMODEL_MAX_POOL_SIZE = 50

  出现这个问题,第一个要考虑到各个Python包的版本问题。我将涉及到的主要包的版本全部pip install成requirements.txt给出的版本。包括:Django、django-neomodel、neo4j-driver和neomodel。
  我故意将路径改为bolt://neo4j:123456@localhost:7687/neo4j,意思是查找这个active的DBMS下名字为neo4j的数据库。我通过尝试发现,neo4j的3.5版本及以下只能有一个数据库(所以根本不需要指定数据库,这也是为什么很多项目都没有提及指定数据库的路径),而4.0及以上的版本有一个system、neo4j默认的和自己创建的数据库。难怪会报错,原来路径是不符合bolt3.0的协议:

  index.html是我写在templates中的模板。同时,记得把setting中默认的数据库路径注释掉:

DATABASES = {
    # 'default': {
    #     'ENGINE': 'django.db.backends.sqlite3',
    #     'NAME': BASE_DIR / 'db.sqlite3',
    # }
}

  沿着网页报错信息往下看,我发现了这不就是neo4j的Cypher图查询语言么?Spot是我写的model类,而Spot可能是django_model 默认的标签,而这也是我各个Python的包,包括neo4j的版本没有降之前没有查找到数据的原因。因为我的label都是自定义的。接着,我在3.5.32版本的neo4j的数据库中CREATE (spot:Spot{name:'北京天坛',position:'北京'})插入一个节点。

  在models.py中,我们可以通过参数__label__来选择Neo4j中的标签:

class Spot(DjangoNode):
    # Spot 是默认标签
    __label__ = '人物'
    id = UniqueIdProperty(primary_key=True)
    name = StringProperty()
3、最终

  终于查到了,这是一个Spot类,我们也可以重写str方法:

  我再展示一下目录结构吧:

  做个总结:Neo4j 4.0版本及以上,因为在DBMS中可以创建多个数据库,在setting中需要指定数据库。config.DATABASE_URL = 'bolt://neo4j的用户名:neo4j的密码@本机ip地址:端口号/database name'。而Neo4j 4.0以下的版本则不用。最后还需要注意一下label的问题。
  全网博客这种问题基本没有提及,希望读者能少走一些弯路。内容已经写得很清楚。原创不易,有帮助请支持一下。
  PS:未经允许不得转载。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/734231.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫

发表评论

登录后才能评论

评论列表(0条)

保存