2012-11-05 85 views
2

我目前正在使用python/flask構建一個web服務,並且希望在neo4j之上構建我的數據層,因爲我的核心數據結構本質上是一個圖。 對於這種情況,我對neo4j提供的不同技術有點困惑。特別是:使用neo4J(服務器)從python事務

1 /我最初計劃通過py2neo使用REST API,但缺少事務是有點問題。

2 /「嵌入式數據庫」neo4j似乎不適合我的情況。我想當你使用批量和一次性分析時,這很有用,並且不需要將數據庫存儲在與Web服務器不同的服務器上。

3 /我已經偶然發現了neo4django項目,但我不確定這個提供事務支持(因爲python沒有neo4j的本地客戶端),並且如果在外部使用它會是一個問題Django本身。事實上,在查看了項目的文檔後,我覺得它具有完全相同的侷限性,也就是說沒有事務(但是,如果在一次連接超時後就會損壞模型,那麼如何構建真實世界的服務?) 。我甚至不明白該項目有什麼用處。

任何人都可以推薦任何東西嗎?我感覺完全卡住了。

感謝REST API客戶

回答

5

無就能明確支持(正確)的交易,因爲該功能通過Neo4j的REST API接口是不可用的。有一些替代方法,如Cypher查詢和批處理執行,它們都在服務器端的單個原子事務中運行;然而,我的客戶端應用程序的一般方法是嘗試構建可以優雅地處理部分完整數據的代碼,從而不需要顯式事務控制。

通常,這種方法會大量使用唯一索引,這也是我在py2neo中提供了大量「get_or_create」類型方法的原因之一。 Cypher本身非常強大,並且還提供了獨特功能,特別是通過CREATE UNIQUE子句。使用這些,你可以使你的寫作是冪等的,並且你可以在「不止一次地執行」安全的方面犯錯,因爲你知道你不會得到重複的數據。

同意,這種方法本身並不給你交易,但在大多數情況下它可以給你一個相同的最終結果。對於您的應用交易中確實需要這是非常值得的。

希望這有助於

奈傑爾

2

我覺得neo4django利用了neo4j-rest-client,即通過batch resource確實在Neo4j的REST接口支持交易。

的語法非常類似於Python中的Neo4j所使用的API emebedded:

>>> n = gdb.nodes.create() 

>>> n["age"] = 25 

>>> n["place"] = "Houston" 

>>> n.properties 
{'age': 25, 'place': 'Houston'} 

>>> with gdb.transaction(): 
    ....:   n.delete("age") 
    ....: 

>>> n.properties 
{u'place': u'Houston'} 

更多信息,請Neo4j的休息客戶端文檔中關於transactions中找到。

相關問題