在py2neo.ogm中创建关系查询

时间:2017-05-10 08:36:07

标签: neo4j py2neo

我正在使用py2neo.ogm api根据其与另一个类的关系构建我的IssueOGM类的查询。

我可以看出为什么会失败:

>>> list(IssueOGM.select(graph).where(
...     "_ -[:HAS_TAG]- (t:TagOGM {tag: 'critical'})"))

Traceback (most recent call last):
...
py2neo.database.status.CypherSyntaxError: Variable `t` not defined (line 1, column 42 (offset: 41))
"MATCH (_:IssueOGM) WHERE _ -[:HAS_TAG]- (t:TagOGM {tag: 'critical'}) RETURN _"

有没有办法使用OGM api创建一个解释为此的过滤器?

"MATCH (_:IssueOGM) -[:HAS_TAG]- (t:TagOGM {tag: 'critical'}) RETURN _"

1 个答案:

答案 0 :(得分:1)

与ORM一样,OGM似乎非常适合快速存储和/或从图表中检索节点,并保存特殊方法等等,以使每个节点都能正常工作。很好地在您的应用程序中。在这种情况下,您可以使用RelatedFrom上的TagOGM类列出标记有特定标记的所有问题。但是,这种方法有时会导致很多无意中的db调用而没有意识到(特别是在大型应用程序中)。

通常对于这样的情况(您正在寻找模式而不是特定节点),我建议您只编写一个密码查询来完成工作。通过允许您将其存储为py2neo.ogm的类方法,GraphObject实际上非常简单。在您的示例中,以下内容应该起作用。在将来编写类似的查询还可以让您根据更复杂的标准进行搜索,并利用neo4j和cypher的功能在单个事务中快速创建非常复杂的查询(而不是在操作时快速返回数据库) OGM对象)。

from py2neo import GraphObject, Property

class TagOGM(GraphObject):
    name = Property()

class IssueOGM(GraphObject):
    name = Property()
    time = Property()
    description = Property()

    @classmethod
    def select_by_tag(cls, tag_name):
        '''
        Returns an OGM instance for every instance tagged a certain way
        '''
        q = 'MATCH (t:TagOGM { name: {tag_name} })<-[:HAS_TAG]-(i:IssueOGM) RETURN i'
        return [
            cls.wrap(row['i'])
            for row in graph.eval(q, { 'tag_name': tag_name }).data()
        ]