2015-12-14 45 views
1

我運行這段代碼:py2neo緩存燒我嗎?

c = """ 
    match(r:XX) 
    optional match(r)-[]-(m) with count(m) as mc, r match(x) 
    return count(x) as all, r, mc 
    """ 
     (snip!) 
     while(True): 
      tx = remote_graph.cypher.begin() 
      res = remote_graph.cypher.execute(c) 
      tx.rollback() 
      time.sleep(15) 
     (snip!) 

我知道一個事實XX節點的屬性正在改變每一秒 - 有一個守護進程運行。然而,當我運行它,我總是得到相同的值回resr只有 - all正在發生變化。查詢不會改變。我不知道py2neo是否注意到這一點,並沒有執行查詢,但是返回一個緩存副本?如果是這樣,我該如何阻止這種情況發生?

編輯 - 更多信息 - 我跑了從上面的IPython內。

+0

什麼'exec_cypher'是怎麼回事?爲什麼'rollback()'? –

+0

@MartinPreusse啊,對不起。 exec_cyper(sic)是我們寫的一個例程,在這種情況下不會影響查詢。我會替換它。 –

+0

@MartinPreusse我可能不需要這裏的'begin()'或'rollback()'。即使在顯然沒有必要的時候,我也從不後悔使用'rollback()'。 –

回答

4

有趣的是,py2neo「記住」的節點,當您返回節點:

MATCH (n:Node) RETURN n 

但是當你回到各自的特性,他們將永遠被更新:

MATCH (n:Node) RETURN n.value 

爲您查詢意味着當您在while循環中返回兩次相同節點時,必須運行my_node.pull()

while True: 
    q = "MATCH (n:Node) RETURN n" 
    result = graph.cypher.execute(q) 
    my_node = result[0][0] 
    my_node.pull() 
    print(my_node) 

您還可以將一切除了pull()圈外:

q = "MATCH (n:Node) RETURN n" 
result = graph.cypher.execute(q) 
my_node = result[0][0] 

while True: 
    my_node.pull() 
    print(my_node) 

這裏是描述行爲小例子:http://paste.ubuntu.com/14015568/

我真的不知道爲什麼py2neo不會返回升級的節點數據,當你運行一個新的查詢。

1

你是什麼意思時,你說該節點的屬性做?你的意思是屬性?或者關係是否被添加/刪除?

你有什麼期望取回r?從查詢來看,除非你提到的守護進程向節點添加/刪除:XX標籤,否則它總是返回完全相同的節點。

+0

屬性,是的。守護進程經常更新屬性。我可以使用neo4j控制檯查看節點,並且看到這些值發生了變化。從我上面的小程序來看,根本不是。 XX是一個單身人士,所以我相信只有一個。 –