1、问题
??这个问题整整困扰了我两天,国内的博客基本都是一笔带过,要不就是用py2neo。py2neo我自己写独立脚本是读写数据进入Neo4j都是没有问题的。后来我把github上面的Django+Neo4j的项目基本开了个遍,也详细看了neomodel和django_model的官方文档和示例。但是都没有得到解决。 ??最初,我通过Neo4j官网上的Using Neo4j from Python寻找Neo4j通过Python连接的方案,文末提到了好几个方案。其中包括:
- Py2neo
- neomodel
- django_model
- neo4django
- 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路径的问题,一直感觉是没有访问到数据库。看大部分的代码,都是这样给的:
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 = {
}
??沿着网页报错信息往下看,我发现了这不就是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):
__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:未经允许不得转载。
|