Prev |  | Next

## 4.3. User database with index

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:

Figure 4.2. 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 );
        nodeIndex.add( node, USERNAME_KEY, username );
        return node;
    }

The next step is to start the database server:

    graphDb = new EmbeddedGraphDatabase( DB_PATH );
    nodeIndex = 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 = nodeIndex.get( USERNAME_KEY,
        idToUserName( idToFind ) ).getSingle();
    System.out.println( "The username of user " + idToFind + " is "
        + foundUser.getProperty( USERNAME_KEY ) );

Full source code: EmbeddedNeo4jWithIndexing.java

Copyright © 2011 Neo Technology

Prev | Up | Next
| Home |