Basic index usage

User database

You have a user database, and want to retrieve users by name. To begin with, this is the structure of the database we want to create:

Node space view of users

That is, the reference node is connected to a users-reference node to which all users are connected.

To begin with, we define the relationship types we want to use:

    private static enum RelTypes implements RelationshipType
    {
        USERS_REFERENCE,
        USER
    }

Then we have created two helper methods to handle user names and adding users to the database:

    private static String idToUserName( final int id )
    {
        return "user" + id + "@neo4j.org";
    }

    private static Node createAndIndexUser( final String username )
    {
        Node node = graphDb.createNode();
        node.setProperty( USERNAME_KEY, username );
        indexService.add( node, USERNAME_KEY, username );
        return node;
    }

The next step is to start the database server:

        graphDb = new EmbeddedGraphDatabase( DB_PATH );
        indexService = graphDb.index().forNodes( "nodes" );
        registerShutdownHook();

It's time to add the users:

        Transaction tx = graphDb.beginTx();
        try
        {
            // Create users sub reference node (see design guidelines on
            // http://wiki.neo4j.org/ )
            Node usersReferenceNode = graphDb.createNode();
            graphDb.getReferenceNode().createRelationshipTo(
                usersReferenceNode, RelTypes.USERS_REFERENCE );
            // Create some users and index their names with the IndexService
            for ( int id = 0; id < 100; id++ )
            {
                Node userNode = createAndIndexUser( idToUserName( id ) );
                usersReferenceNode.createRelationshipTo( userNode,
                    RelTypes.USER );
            }

And here's how to find a user by Id:

            int idToFind = 45;
            Node foundUser = indexService.get( USERNAME_KEY,
                idToUserName( idToFind ) ).getSingle();
            System.out.println( "The username of user " + idToFind + " is "
                + foundUser.getProperty( USERNAME_KEY ) );

Full source code: EmbeddedNeo4jWithIndexing