在 py2neo.ogm 中创建关系查询

Creating relationship queries in py2neo.ogm

我正在使用 py2neo.ogm api 来构造我的 IssueOGM class 的查询,基于它与另一个 class 的关系。

我明白为什么失败了:

>>> 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 _"

与 ORM 一样,OGM 似乎非常适合快速存储 and/or 从图形中检索节点,并保存特殊方法等以使每个节点 'work' 在您的应用程序中很好.在这种情况下,您可以在 TagOGM 上使用 RelatedFrom class 来列出所有标有特定标签的问题。但是,这种方法有时会导致在没有意识到的情况下进行大量无意的数据库调用(尤其是在大型应用程序中)。

通常对于这种情况(您正在寻找模式而不是特定节点),我建议您只编写一个密码查询来完成工作。 py2neo.ogm 实际上使这非常简单,允许您将其存储为 GraphObject 的 class 方法。在您的示例中,类似以下的内容应该有效。将来编写类似的查询还将允许您基于更复杂的条件进行搜索,并利用 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()
        ]