4

私はpy2neoとneo4jを使い始めたばかりです。

データベースでインデックスを使用する方法について混乱しています。

create_user 関数を作成しました。

g = neo4j.GraphDatabaseService()
users_index = g.get_or_create_index(neo4j.Node, "Users")
def create_user(name, username, **kwargs):
    batch = neo4j.WriteBatch(g)
    user = batch.create(node({"name" : name, "username" : username}))
    for key, value in kwargs.iteritems():
        batch.set_property(user, key, value)
    batch.add_labels(user, "User")
    batch.get_or_add_to_index(neo4j.Node, users_index, "username", username, user)
    results = batch.submit()
    print "Created: " + username

ユーザー名でユーザーを取得するには、次のようにします。

def lookup_user(username):
    print node(users_index.get("username", username)[0])

Schemaクラスを見て、ラベルにインデックスを作成できることに気付きましたが"User"、インデックスを取得してエンティティを追加する方法がわかりませんでした。

できるだけ効率的にしたいので、"User"後で異なるラベルのノードを追加する場合に備えて、ラベルにインデックスを追加するとパフォーマンスが向上しますか? それはすでに可能な限り最も効率的ですか?

また、ユーザー名システムをユーザーごとに一意にしたい場合、どうすればそれを行うことができますか? batch.get_or_add_to_indexがエンティティを取得または追加しているかどうかを知るにはどうすればよいですか?

4

1 に答える 1

8

あなたの混乱は理解できます。Neo4j には、実際には 2 種類のインデックスがあります。レガシー インデックス (get_or_create_index メソッドでアクセスします) と新しいインデックス (ラベルに基づくインデックス作成を処理します) です。

新しいインデックスは、手動で最新の状態に保つ必要はありません。グラフに変更を加えても同期され、そのラベル/プロパティ ペアに対してサイファー クエリを発行すると自動的に使用されます。

従来のインデックスが保持されている理由は、地理空間インデックス、全文インデックス、複合インデックスなど、新しいインデックスではまだ利用できない複雑な機能をサポートしているためです。

于 2014-04-07T10:31:35.963 に答える