2017-05-10 77 views
0

我正在使用py2neo.ogm api根據與其他類的關係構造我的IssueOGM類的查詢。在py2neo.ogm中創建關係查詢

我明白爲什麼失敗:

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

就像一個ORM時,OGM似乎是快速存儲和/或從圖中檢索節點,並保存特殊的方法等等,以使每個節點的「工作」很好地在您的應用程序確實不錯。在這種情況下,您可以使用TagOGM上的RelatedFrom類來列出使用特定標記標記的所有問題。但是,這種方法有時會導致大量無意的數據庫調用而沒有意識到(特別是在一個大的應用程序中)。

通常對於這種情況(您正在尋找模式而不是特定節點的地方),我建議您只需編寫一個密碼查詢來完成任務。 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() 
     ]