我是 Django 和 neo4j 的新手。我正在使用 Django 1.4.5、neo4j 1.9.2 和 neo4django 0.1.8
我已经为一个人节点创建了 NodeModel 并在“所有者”和“名称”属性上对其进行了索引。这是我的models.py:
from neo4django.db import models as models2
class person_conns(models2.NodeModel):
owner = models2.StringProperty(max_length=30,indexed=True)
name = models2.StringProperty(max_length=30,indexed=True)
gender = models2.StringProperty(max_length=1)
parent = models2.Relationship('self',rel_type='parent_of',related_name='parents')
child = models2.Relationship('self',rel_type='child_of',related_name='children')
def __unicode__(self):
return self.name
在连接到 Neo4j 服务器之前,我将自动索引设置为 True,并在 conf/neo4j.properties 文件中提供了可索引键,如下所示:
# Autoindexing
# Enable auto-indexing for nodes, default is false
node_auto_indexing=true
# The node property keys to be auto-indexed, if enabled
node_keys_indexable=owner,name
# Enable auto-indexing for relationships, default is false
relationship_auto_indexing=true
# The relationship property keys to be auto-indexed, if enabled
relationship_keys_indexable=child_of,parent_of
我按照Neo4j: Step by Step 创建一个自动索引来更新上述文件并在 neo4j 服务器上手动创建 node_auto_index。
以下是在neo4j数据库上执行django的syndb并手动创建自动索引后在neo4j服务器上创建的索引:
graph-person_conns lucene
{"to_lower_case":"true", "_blueprints:type":"MANUAL","type":"fulltext"}node_auto_index lucene {"_blueprints:type":"MANUAL", "type":"exact"}
正如https://github.com/scholrly/neo4django/issues/123中所建议的,我使用 connection.cypher(queries) 来查询 neo4j 数据库
例如:
listpar = connection.cypher("START no=node(*) RETURN no.owner?, no.name?",raw=True)
以上正确返回所有节点的所有者和名称。但是当我尝试查询索引属性而不是“数字”或“*”时,例如:
listpar = connection.cypher("START no=node:node_auto_index(name='s2') RETURN no.owner?, no.name?",raw=True)
上面给出了 0 行。
listpar = connection.cypher("START no=node:graph-person_conns(name='s2') RETURN no.owner?, no.name?",raw=True)
以上给出
异常值:
错误 [400]:错误请求。错误的请求语法或不受支持的方法。发送的数据无效:(' expected but
-' 在图表后发现
我尝试了其他字符串,例如 name, person_conns 而不是 graph-person_conns 但每次它都会给出特定索引不存在的错误。添加索引时我做错了吗?
我的项目主要依赖于根据属性过滤节点,所以这部分真的很重要。任何指针或建议将不胜感激。谢谢你。
这是我在 stackoverflow 上的第一篇文章。因此,如果有任何缺失的信息或令人困惑的陈述,请耐心等待。谢谢你。
更新:感谢您的帮助。为了其他人的利益,我想举例说明如何使用密码查询来遍历/查找两个节点之间的最短路径。
from neo4django.db import connection
results = connection.cypher("START source=node:`graph-person_conns`(person_name='s2sp1'),dest=node:`graph-person_conns`(person_name='s2c1') MATCH p=ShortestPath(source-[*]->dest) RETURN extract(i in nodes(p) : i.person_name), extract(j in rels(p) : type(j))")
这是在图中找到名为 s2sp1 和 s2c1 的节点之间的最短路径。Cypher 查询真的很酷,可以帮助遍历限制跳数、关系类型等的节点。
有人可以评论这种方法的性能吗?另外请建议是否有任何其他有效的方法可以从 Django 访问 Neo4j。谢谢你 :)