我正在使用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 _"
答案 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()
]