2013-01-11 51 views
6

我現在正在嘗試學習如何連接到Neo4j服務器並使用來自Python的Bulbflow在其上運行Cypher查詢。我不明白的是兩種可能性之間的區別連接到Neo4j的服務器:Bulbflow:neo4jserver Graph和neo4jserver之間的區別Neo4jclient

1)Graph

from bulbs.neo4jserver import Graph 
g = Graph() 

2)Neo4jClient

from bulbs.neo4jserver import Neo4jClient 
client = Neo4jClient() 

任何人都可以請解釋概念區別在哪裏? 如果我想要執行(相當多)Cypher查詢服務器並最終並行執行,選擇哪種方式更好?

PS:我沒有足夠的信譽來塑造一個標籤「bulbflow」對於這個問題:)

回答

13

Bulbs支持三種不同的圖形數據庫服務器 - Neo4j ServerRexster,現在Titan

特定於每個後端服務器的代碼包含在其自己的Python包(目錄)中。你應該看到的目錄爲:neo4jserver,rexster,鈦:

Neo4jClient是Neo4j的服務器的低級別的適配器 - 你通常不需要使用此直接除非你正在做自定義的東西 - 而是使用高級的Graph類。

見燈泡文檔的...

燈泡快速入門指南提供了有關使用Graph接口的例子:

但是,當您需要通過_client變種,您的燈泡對象始終可以訪問低級客戶端。

Lightbulb是我創建的示例應用程序,用於展示如何使用和定製燈泡模型 - 它是一個Python博客引擎,它使用Git進行源代碼控制,並使用圖形數據庫進行持久化。

燈泡最初設計用於與自由Neo4j Heroku Add On使用,但兩者燈泡和燈泡使Gremlin大量使用,以及Neo4j的Heroko添加論自由不再提供精怪版。

燈泡模型文件包含一個高度定製Entry模型和一個自定義Graph類 - 的Entry模型採用了低級別的客戶端的:

由於您可以在Entry模型中看到,我可以通過_client var訪問低級客戶端,並使用它從scripts庫中獲取Gremlin腳本,然後再次執行Gremlin腳本。

下面是由輸入模型中使用的save_blog_entry小鬼腳本代碼:

注意:只有在文件中一個小鬼腳本,但它很大,包含 幾個操作,並且一切都被包裝在一個事務中。 將所有操作放入單個Gremlin腳本允許您在一個事務性請求中執行所有操作,而不是將多個請求發送到服務器的開銷爲 。

除非你正在做的事情就像定製的模型,你通常會使用scripts對象並存儲在對象的gremlin對象:

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> script = g.scripts.get('some_script') 
>>> params = dict(name="James", city="Dallas") 
>>> g.gremlin.execute(script, params) 

看到燈泡的Neo4j小鬼文檔...

同樣,當您要執行Neo4j Cypher查詢時,請使用存儲在對象上的cypher對象。

有三種暗號方法(不幸的是,這些都沒有記錄在網站上還):

  1. g.cypher.query():返回節點/關係列表時使用 - 將他們初始化的對象。
  2. g.cypher.table():返回Cypher表數據時使用。
  3. g.cypher.exectue():返回任意數據時使用 - 它返回一個通用的Response對象。

你可以看看源代碼,看看它們是如何工作的...

下面是使用的Cypher查詢()方法(該查詢簡單地返回一個關係)的一些例子:

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> query = "start a = relationship({eid}) return a" 
>>> params = dict(eid=123) 
>>> edges = g.cypher.query(query, params) 

查詢方法自動初始化元件到他們的類型。如果您將該元素創建爲自定義模型,則燈泡會嘗試將其初始化爲特定類型,否則將默認爲通用的VertexEdge

請注意,燈泡Cypher query()方法返回一個迭代器。

你也可以遍歷迭代器......

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> query = "start a = relationship({eid}) return a" 
>>> params = dict(eid=123) 
>>> edges = g.cypher.query(query, params) 
>>> for edge in edges: print edge 

...或將其轉換爲一個列表...

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> query = "start a = relationship({eid}) return a" 
>>> params = dict(eid=123) 
>>> edges = g.cypher.query(query, params) 
>>> list(edges) 

...或獲取下一個項目...

>>> from bulbs.neo4jserver import Graph 
>>> g = Graph() 
>>> query = "start a = relationship({eid}) return a" 
>>> params = dict(eid=123) 
>>> edges = g.cypher.query(query, params) 
>>> edges.next() 

如果您有任何疑問,請讓我知道。

+0

非常詳細的答案感謝例子。 – npobedina

+1

密碼查詢選項真的難倒我,直到我遇到這個。在文檔中找到.query(),.table()和.execute()會很有幫助!否則我是一個燈泡的粉絲 - 謝謝! – zanbri

+0

模塊是否仍然有效,因爲它尚未更新很久? – badc0re