当前位置:   article > 正文

Django框架使用Neomodel、django_model连接Neo4j时返回空数组的问题解决_django-neomodel

django-neomodel

1、问题

  这个问题整整困扰了我两天,国内的博客基本都是一笔带过,要不就是用py2neo。py2neo我自己在pycharm写独立脚本,读写数据进入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、解决

  过程很折磨,求学之路就是如此,得好好坐冷板凳。
  其实我很早就想到setting路径的问题,一直感觉是没有访问到数据库。看大部分的代码,都是这样给的:

# 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

或者是

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
  • 1
  • 2
  • 3
  • 4
  • 5

  出现这个问题,第一个要考虑到各个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',
    # }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
'
运行

  更新一下:如果注释掉默认的数据库,在执行python manage.py migrate语句会报错,提示找不到默认引擎,但是访问页面没有问题。
  沿着网页报错信息往下看,我发现了这不就是neo4j的Cypher图查询语言么?Spot是我写的model类,而Spot可能是django_model 默认的标签,而这也是我各个Python的包,包括neo4j的版本没有降之前没有查找到数据的原因。因为我的label都是自定义的。接着,我在3.5.32版本的neo4j的数据库中CREATE (spot:Spot{name:'北京天坛',position:'北京'})插入一个节点。
tracing
  在models.py中,我们可以通过参数__label__来选择Neo4j中的标签:

class Spot(DjangoNode):
    # Spot 是默认标签
    __label__ = '人物'
    id = UniqueIdProperty(primary_key=True)
    name = StringProperty()
  • 1
  • 2
  • 3
  • 4
  • 5

3、最终

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小桥流水78/article/detail/1013779
推荐阅读
相关标签
  

闽ICP备14008679号