2014-04-07 3 views
3

저는 py2neo 및 neo4j로 작업하기 시작했습니다.neo4j 및 py2neo에서 인덱스 작업

데이터베이스에서 색인을 사용하는 방법에 대해 혼란 스럽습니다.

나는 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" 라벨에 인덱스를 만들 수 있습니다 것으로 나타났습니다를 ,하지만 인덱스를 얻고 엔티티를 추가하는 방법을 알 수는 없었습니다.

가능한 한 효율적으로 만들고 싶습니다. 나중에 다른 레이블을 사용하는 노드를 추가 할 경우를 대비하여 레이블에 색인을 추가하면 성능이 향상됩니까? 이미 가장 효율적일까요?

또한 사용자마다 고유 한 사용자 이름 시스템을 원한다면 어떻게 할 수 있습니까? batch.get_or_add_to_index이 엔티티를 가져오고 추가했는지 어떻게 알 수 있습니까?

답변

8

귀하의 혼란은 이해할 수 있습니다. Neo4j에는 실제로 두 가지 유형의 인덱스가 있습니다. 레거시 인덱스 (get_or_create_index 메소드로 액세스하는)와 새 인덱스 (레이블을 기반으로하는 인덱싱을 처리합니다)입니다.

새 색인을 수동으로 최신으로 유지할 필요가 없습니다. 그래프를 변경하면 자동으로 동기화되며, 해당 레이블/속성 쌍에 대해 사이퍼 쿼리를 발행 할 때 자동으로 사용됩니다.

레거시 색인이 유지되는 이유는 지리 공간 색인화, 전체 텍스트 색인화 및 복합 색인화와 같은 새로운 색인에는 아직 사용할 수없는 일부 복잡한 기능을 지원하기 때문입니다.

+0

감사합니다. 이것으로 인해 많은 도움이되었습니다. 레이블 인덱싱을 기반으로하는 속성을 가진 노드에 어떻게 액세스합니까? 유스 케이스의 레거시 인덱스를 계속 사용하도록 권장 하시겠습니까? –

+0

스키마 인덱스는 자동으로 생성됩니다. 스키마를 만든 후에는 인덱싱 된 속성에 의해 노드가 자동으로 추가되고 제거됩니다. 또한 Cypher에서 자동으로 사용됩니다. with MATCH (u : User {name : "foo"}) RETURN u' –

+0

py2neo를 사용하여 데이터베이스를 어떻게 쿼리합니까? 'ReadBatch.get_indexed_nodes'를 사용합니까? 인덱스 매개 변수에는 무엇을 사용합니까? –