관리 메뉴

HAMA 블로그

Neo4j - 인덱스 사용하기 본문

NoSQL

Neo4j - 인덱스 사용하기

[하마] 이승현 (wowlsh93@gmail.com) 2015. 10. 30. 17:32


Neo4j 의 인덱스를 만들고  데이터 넣고, 검색하기 


- 일단 서버부터 시작하자.

GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );


- 이름으로  유저를 인덱스하기위해 데이타베이스를 설정해야한다. 한번에 완료되야 한다.

IndexDefinition indexDefinition;
try ( Transaction tx = graphDb.beginTx() )
{
    Schema schema = graphDb.schema();
    indexDefinition = schema.indexFor( DynamicLabel.label( "User" ) )
            .on( "username" )
            .create();
    tx.success();
}


-인덱스는 처음 생성될때 비동기적으로 구성된다.  완료되기 기다리길 원할때  코어 API 를 사용할수있다.

try ( Transaction tx = graphDb.beginTx() )
{
    Schema schema = graphDb.schema();
     ....

    schema.awaitIndexOnline( indexDefinition, 10, TimeUnit.SECONDS );
}


- User 를  추가해 보자.

try ( Transaction tx = graphDb.beginTx() )
{
    Label label = DynamicLabel.label( "User" );

    // Create some users
    for ( int id = 0; id < 100; id++ )
    {
        Node userNode = graphDb.createNode( label );
        userNode.setProperty( "username", "user" + id + "@neo4j.org" );
    }
    System.out.println( "Users created" );
    tx.success();
}

- id 로 User 를 찾는 방법.
Label label = DynamicLabel.label( "User" );
int idToFind = 45;
String nameToFind = "user" + idToFind + "@neo4j.org";
try ( Transaction tx = graphDb.beginTx() )
{
    try ( ResourceIterator<Node> users =
            graphDb.findNodes( label, "username", nameToFind ) )
    {
        ArrayList<Node> userNodes = new ArrayList<>();
        while ( users.hasNext() )
        {
            userNodes.add( users.next() );
        }

        for ( Node node : userNodes )
        {
            System.out.println( "The username of user " + idToFind + " is " + node.getProperty( "username" ) );
        }
    }
}


- User 의 이름을 업데이트 할때, 인덱스도 업데이트 됨.

try ( Transaction tx = graphDb.beginTx() )
{
    Label label = DynamicLabel.label( "User" );
    int idToFind = 45;
    String nameToFind = "user" + idToFind + "@neo4j.org";

    for ( Node node : loop( graphDb.findNodes( label, "username", nameToFind ) ) )
    {
        node.setProperty( "username", "user" + ( idToFind + 1 ) + "@neo4j.org" );
    }
    tx.success();
}


 - User 를 삭제하면 자동적으로 인덱스에서 삭제됨.

try ( Transaction tx = graphDb.beginTx() )
{
    Label label = DynamicLabel.label( "User" );
    int idToFind = 46;
    String nameToFind = "user" + idToFind + "@neo4j.org";

    for ( Node node : loop( graphDb.findNodes( label, "username", nameToFind ) ) )
    {
        node.delete();
    }
    tx.success();
}


- 데이터 모델을 바꿀때  , 필요없어진 인덱스를 드랍 할수있다.

try ( Transaction tx = graphDb.beginTx() )
{
    Label label = DynamicLabel.label( "User" );
    for ( IndexDefinition indexDefinition : graphDb.schema()
            .getIndexes( label ) )
    {
        // There is only one index
        indexDefinition.drop();
    }

    tx.success();
}



http://neo4j.com/docs/stable/tutorials-java-embedded-new-index.html

'NoSQL' 카테고리의 다른 글

Neo4j - Traversal  (0) 2015.10.30
Neo4j 인사이드 : 파일 스토리지  (0) 2015.10.30
시계열 DB (OpenTSDB , 인플럭스 DB , Graphite ) 정리  (0) 2015.10.22
MongoDB vs Couchbase (2)  (0) 2015.09.03
MongoDB vs Couchbase (1)  (0) 2015.09.03
Comments