6

現在、Neo4j サーバーに接続し、Python から Bulbflow を使用して Cypher クエリを実行する方法を学習しようとしています。そして、私が理解していないのは、neo4j サーバーに接続する 2 つの可能性の違いです。

1)グラフ

from bulbs.neo4jserver import Graph
g = Graph()

2) Neo4jクライアント

from bulbs.neo4jserver import Neo4jClient
client = Neo4jClient()

ここで概念的な違いを誰か説明してもらえますか? そして、サーバーに対して (かなり多くの) Cypher クエリを実行し、最終的に並行して実行したい場合、どの方法を選択するのが良いでしょうか?

PS: この質問に「bulbflow」というタグを付けるほどの評判はありません :)

4

1 に答える 1

13

Bulbsは、 3 つの異なるグラフ データベース サーバー ( Neo4j サーバーRexster、そして現在はTitan ) をサポートしています。

各バックエンド サーバーに固有のコードは、独自の Python パッケージ (ディレクトリ) に含まれています。次のディレクトリが表示されます: neo4jserver、rexster、titan:

Neo4jClientNeo4j サーバー用の低レベル アダプターです。通常、カスタム処理を行う場合を除き、これを直接使用する必要はありません。代わりに、高レベルの Graph クラスを使用してください。

電球のドキュメントを参照してください...

Bulbs クイックスタート ガイドには、Graphインターフェイスの使用例が記載されています。

ただし、Bulbs オブジェクトは、必要なときに_clientvar.

Lightbulb は、Bulbs モデルの使用方法とカスタマイズ方法を示すために私が作成したサンプル アプリです。これは、Git をソース管理に使用し、グラフ データベースを永続化に使用する Python ブログ エンジンです。

Lightbulb はもともと、無料のNeo4j Heroku Add Onで使用するために設計されましたが、Bulbs と Lightbulb の両方でGremlinが多用されており、Neo4j Heroko Add On の無料版では Gremlin が提供されなくなりました。

Lightbulb モデル ファイルには、大幅にカスタマイズされたEntryモデルとカスタムGraphクラスが含まれています。このEntryモデルは、低レベルのクライアントを使用します。

モデルでわかるように、 varEntryを介して低レベルのクライアントにアクセスできます。これを使用してライブラリから Gremlin スクリプトを取得し、Gremlin スクリプトを再度実行します。_clientscripts

save_blog_entryEntry モデルで使用される Gremlin スクリプトのコードは次のとおりです。

注: ファイルには Gremlin スクリプトが 1 つしかありませんが、サイズが大きく、いくつかの操作が含まれており、すべてがトランザクションにラップされています。すべての操作を単一の Gremlin スクリプトに入れることで、サーバーに複数のリクエストを送信するオーバーヘッドが発生するのではなく、1 つのトランザクション リクエストですべてを実行できます。

モデルのカスタマイズなどを行っていない限り、通常はscriptsオブジェクトとgremlinオブジェクトに保存されているオブジェクトを使用しgraphます。

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

Bulbs Neo4j Gremlin ドキュメントを参照してください...

同様に、Neo4j Cypher クエリを実行する場合は、cypherオブジェクトに格納されているgraphオブジェクトを使用します。

Cypher には 3 つの方法があります (残念ながら、これらはまだ Web サイトに記載されていません)。

  1. g.cypher.query(): ノード/関係のリストを返すときに使用されます -- それらをオブジェクトに初期化します。
  2. g.cypher.table(): Cypher テーブル データを返すときに使用されます。
  3. g.cypher.exectue(): 任意のデータを返すときに使用されます -- 汎用Responseオブジェクトを返します。

ソースコードを見て、それらがどのように機能するかを確認できます...

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)

query メソッドは、要素をその型に自動的に初期化します。要素をカスタム モデルとして作成した場合、Bulbs はそれを特定の型に初期化しようとします。それ以外の場合は、既定でジェネリックVertexまたはEdge.

Bulbs 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()

ご不明な点がございましたら、お気軽にお問い合わせください。

于 2013-03-12T09:55:10.137 に答える