Django models 如何在Neo4django的cypher查询中使用节点模型的索引属性?

Django models 如何在Neo4django的cypher查询中使用节点模型的索引属性?,django-models,indexing,neo4j,neo4django,Django Models,Indexing,Neo4j,Neo4django,我是Django和neo4j的新手。我使用的是Django 1.4.5、neo4j 1.9.2和neo4django 0.1.8 我已经为person节点创建了NodeModel,并在“owner”和“name”属性上为其编制了索引。这是我的models.py: from neo4django.db import models as models2 class person_conns(models2.NodeModel): owner = models2.StringPropert

我是Django和neo4j的新手。我使用的是Django 1.4.5、neo4j 1.9.2和neo4django 0.1.8

我已经为person节点创建了NodeModel,并在“owner”和“name”属性上为其编制了索引。这是我的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服务器上手动创建了node_auto_索引

以下是在neo4j数据库上执行django的syndb并手动创建自动索引后,在neo4j服务器上创建的索引:

  • graph-person\u conns lucene
    {“to_lower_case”:“true”,“_蓝图:type”:“MANUAL”,“type”:“fulltext”}
  • 节点自动索引lucene {“_蓝图:类型”:“手动”,“类型”:“精确”}
  • 正如在中所建议的,我使用connection.cypher(查询)来查询neo4j数据库

    例如:

    listpar=connection.cypher(“开始编号=节点(*)返回编号owner?,编号name?,raw=True)

    上面正确返回所有节点的所有者和名称。但当我尝试查询索引属性而不是“number”或“*”时,例如:

    listpar=connection.cypher(“开始编号=节点:节点自动索引(name='s2')返回编号:owner?,编号?),raw=True)

    上面给出了0行

    listpar=connection.cypher(“开始编号=节点:graph-person_conns(name='s2')返回编号owner?,编号name?,原始编号=True)

    以上给出

    异常值:
    错误[400]:请求错误。错误的请求语法或不支持的方法。 发送的数据无效:
    (“应为,但在图形后找到”
    -”

    我尝试了其他字符串,比如name、person\u conns,而不是graph-person\u conns,但每次它都给出错误,即特定索引不存在。添加索引时我是否出错

    我的项目主要依赖于根据属性过滤节点,所以这部分非常重要。任何建议都将不胜感激。谢谢

    这是我在stackoverflow上的第一篇文章。因此,如果有任何信息缺失或声明混乱,请耐心等待。谢谢

    更新: 谢谢你的帮助。为了其他人的利益,我想举一个例子,说明如何使用cypher查询遍历/查找两个节点之间的最短路径

    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。谢谢:)

    Hm,为什么要使用Cypher?neo4django
    QuerySet
    s如果将属性设置为
    indexed=True
    (或者不设置,这些属性的速度会慢一些),那么它就可以很好地执行上述操作

    有一些其他查询示例,例如。Neo4django在后端以密码的形式执行这些查询——除非您有非常特殊的遍历模式或性能问题,否则您真的不需要亲自编写密码

    无论如何,为了更直接地解决您的问题,您使用的最后一个示例需要倒勾来转义索引名,如

    listpar = connection.cypher("START no=node:`graph-person_conns`(name='s2') RETURN no.owner?, no.name?",raw=True)
    
    第一个例子应该有效。一个想法-您是在保存正在搜索的节点之前还是之后打开自动索引的?如果在之后,请注意,您必须使用Java API或通过在节点上重新设置属性来手动重新索引节点,因为它不会被自动索引


    欢迎来到StackOverflow

    嗯,你为什么要用密码?neo4django
    QuerySet
    s如果将属性设置为
    indexed=True
    (或者不设置,这些属性的速度会慢一些),那么它就可以很好地执行上述操作

    有一些其他查询示例,例如。Neo4django在后端以密码的形式执行这些查询——除非您有非常特殊的遍历模式或性能问题,否则您真的不需要亲自编写密码

    无论如何,为了更直接地解决您的问题,您使用的最后一个示例需要倒勾来转义索引名,如

    listpar = connection.cypher("START no=node:`graph-person_conns`(name='s2') RETURN no.owner?, no.name?",raw=True)
    
    第一个例子应该有效。一个想法-您是在保存正在搜索的节点之前还是之后打开自动索引的?如果在之后,请注意,您必须使用Java API或通过在节点上重新设置属性来手动重新索引节点,因为它不会被自动索引


    欢迎来到StackOverflow

    谢谢大家!!这很有魅力。尽管文档只介绍了基本知识,但我只能通过您对所有站点上所有帖子的快速详细回复来学习neo4django的所有魔法。我真的很感激你的工作。谢谢!实际上,我需要找到两个节点之间的最短路径,因此需要与密码查询进行斗争。谢谢!这很有魅力。尽管文档只介绍了基本知识,但我只能通过您对所有站点上所有帖子的快速详细回复来学习neo4django的所有魔法。我真的很感激你的工作。谢谢!实际上,我需要找到两个节点之间的最短路径,因此需要与密码查询进行斗争。