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" );
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 ) )
{
indexDefinition.drop();
}
tx.success();
}
http://neo4j.com/docs/stable/tutorials-java-embedded-new-index.html