2012-02-24 13 views
2

タグノードとurlノードを持つデータベースを構築していますが、urlノードはタグノードに接続しています。この場合、同じURLをデータベースに挿入すると、重複するURLノードを作成するのではなく、タグ・ノードにリンクする必要があります。索引付けはこの問題を解決すると思います。 neo4jrestclientを使用して、どのように索引付けおよびトラバーサルを行うことが可能ですか。チュートリアルへのリンクはうまくいくでしょう。私は現在versae neo4jrestclientを使用しています。pythonでneo4jのノードをインデックスする

おかげ

答えて

5

neo4jrestclientは、インデックス作成とグラフをトラバースの両方をサポートしていますが、私はあなたのユースケースのためにenoguh可能性だけでインデックスを使用してだと思います。しかし、私はあなたの問題を適切に理解しているかどうかはわかりません。とにかく、このような何かは仕事ができる:

>>> from neo4jrestclient.client import GraphDatabase 

>>> gdb = GraphDatabase("http://localhost:7474/db/data/") 

>>> idx = gdb.nodes.indexes.create("urltags") 

>>> url_node = gdb.nodes.create(url="http://foo.bar", type="URL") 

>>> tag_node = gdb.nodes.create(tag="foobar", type="TAG") 

我々は、タグfoobarでタグ付けされたURL "http://foo.bar"の数を追跡保つために関係するプロパティcountを追加します。

>>> url_node.relationships.create(tag_node["tag"], tag_node, count=1) 

その後、URLの値に基づいてurlノードをインデックス付けします。私は、タグのノードでタグ付けされた新しいURLノードを作成する必要がある場合に

>>> idx["url"][url_node["url"]] = url_node 

その後、我々は最初にそれがまだインデックスされるかどうかをチェックするためにインデックスを照会します。それ以外の場合は、ノードを作成して索引付けします。

>>> new_url = "http://foo.bar2" 

>>> nodes = idx["url"][new_url] 

>>> if len(nodes): 
...  rel = nodes[0].relationships.all(types=[tag_node["tag"]])[0] 
...  rel["count"] += 1 
... else: 
...  new_url_node = gdb.nodes.create(url=new_url, type="URL") 
...  new_url_node.relationships.create(tag_node["tag"], tag_node, count=1) 
...  idx["url"][new_url_node["url"]] = new_url_node 
+1

ご協力ありがとうございます。 – jvc

+1

歓迎:-D –

3

重要な概念は、オブジェクトがノードまたはインデックスを作成する関係のいずれかですインデックスはキー/値/オブジェクトのトリプレットであるということです。インデックスを作成し、使用する

ステップ:

グラフデータベースの残りのクライアントのインスタンスを作成します。

from neo4jrestclient.client import GraphDatabase 
gdb = GraphDatabase("http://localhost:7474/db/data/") 

nelly = gdb.nodes.create(name='Nelly Furtado') 
shakira = gdb.nodes.create(name='Shakira') 

index['latin_genre'][nelly.get('name')] = nelly 
index['latin_genre'][shakira.get('name')] = shakira 

がインデックスに基づいてノードを取得し、さらに処理を行うインデックスにノードを追加します(ここではノードのインデックスを作成する)

index = gdb.nodes.indexes.create('latin_genre') 

をノードまたは関係のインデックスを作成します。

for artist in index['latin_genre']['Shakira']: 

    print artist.get('name') 

詳細は、webadminの注釈から見つけることができます。

Neo4jには2つのタイプの索引、ノード索引および関係索引があります。 ノード索引では索引付けしてノードを検索し、関係索引では を使用して関係を同じにします。

各インデックスには、そのインデックスを処理する基本実装 があるプロバイダがあります。デフォルトのプロバイダはluceneですが、好きな場合は 独自のインデックスを作成できます。

のNeo4jインデックスは、キー/値/オブジェクトトリプレットを取る(「オブジェクト」ノードまたは 関係にある)、それ意志インデックスキー/値のペア、および準提供されるオブジェクトを使用してこの 。 キー/値/オブジェクトトリプレットのセットを索引付けした後で、索引を照会して、照会に一致するキー/値の組で索引付けされたオブジェクト を戻すことができます。例えば

、あなたは急速にユーザー名または電子メールによってそれらを見つけるあなたのデータベースに「ユーザー」ノードを持っている、と したい場合は、ノードインデックスを作成することができ という名前の「ユーザー」、および各ユーザインデックスのユーザー名と電子メールの。 のデフォルトのルーネン設定では、 "ユーザー名:bob OR email:[email protected]"のようなクエリを使用して、 "Users"インデックス を検索することができます。

あなたはあなたのインデックスこの方法を照会するために、データブラウザを使用することができ、上記のクエリのための 構文は、「ノード:インデックス:ユーザー:ユーザー名:ボブOR メール:[email protected]」です。

関連する問題