Showing posts with label Advanced database. Show all posts
Showing posts with label Advanced database. Show all posts

Wednesday, December 24, 2014

Using Neo4j using core java API

Follow these steps to create a simple graph

Install neo4j  from here

Add the neo4j jar file neo4j-desktop-2.1.6 to the project from the folder Program Files (x86)\Neo4j Community\bin

Sample code

package blog.neo4j;
import java.io.File;
import java.util.Iterator;
import java.util.concurrent.TimeUnit;
import org.neo4j.cypher.javacompat.ExecutionEngine;
import org.neo4j.cypher.javacompat.ExecutionResult;

import org.neo4j.graphdb.DynamicLabel;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.Label;
import org.neo4j.graphdb.ResourceIterator;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.helpers.collection.IteratorUtil;
import org.neo4j.graphdb.schema.IndexDefinition;
import org.neo4j.graphdb.schema.Schema;
/**
 *
 * @author sony
 */
public class EmbeddedNeo4j {
    private static final String DB_PATH = "target/neo4j-hello-db";

  

    // START SNIPPET: vars
    GraphDatabaseService graphDb;

    // END SNIPPET: vars

    // START SNIPPET: createReltype
    private static enum RelTypes implements RelationshipType
    {
        FOLLOWEDBY,
        FOLLOWEROF,
        TWEETED,
        TWEETED_BY
    }
    // END SNIPPET: createReltype
    private static enum LabelTypes implements Label
    {
        USER,
        TWEET
    }


    void deletePreviousDatabase()
    {
        deleteFileOrDirectory( new File( DB_PATH ) );
    }

    void startDb()
    {
        graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );
        registerShutdownHook( graphDb );
    }
    void createIndex()
    {
        IndexDefinition indexDefinition,indexDefinition1;
        try ( Transaction tx = graphDb.beginTx() )
        {
            Schema schema = graphDb.schema();
            indexDefinition = schema.indexFor( DynamicLabel.label( "USER" ) )
                    .on( "userid" )
                    .create();
            indexDefinition1 = schema.indexFor( DynamicLabel.label( "TWEET" ) )
                    .on( "tweetid" )
                    .create();
            tx.success();
        }
        try ( Transaction tx = graphDb.beginTx() )
            {
                Schema schema = graphDb.schema();
                schema.awaitIndexOnline( indexDefinition1, 10, TimeUnit.SECONDS );
            }
    }
    
    
    void create_nodes_relationships() 
    {
        try ( Transaction tx = graphDb.beginTx() )
        {
                   //Create nodes
            Node user1=graphDb.createNode(LabelTypes.USER);
            user1.setProperty("Userid", 1);
            user1.setProperty("Name","Siva");
            Node user2=graphDb.createNode(LabelTypes.USER);
            user2.setProperty("Userid", 2);
            user2.setProperty("Name", "Kumar");
            Node user3=graphDb.createNode(LabelTypes.USER);
            user3.setProperty("Userid", 3);
            user3.setProperty("Name", "Priya");

            Node tweet1=graphDb.createNode(LabelTypes.TWEET);
            tweet1.setProperty("Tweetid", 1);
            tweet1.setProperty("Text","Hello");
            Node tweet2=graphDb.createNode(LabelTypes.TWEET);
            tweet2.setProperty("Tweetid", 2);
            tweet2.setProperty("Text", "Hai");
            Node tweet3=graphDb.createNode(LabelTypes.TWEET);
            tweet3.setProperty("Tweetid", 3);
            tweet3.setProperty("Text", "Our lives are not our own. From womb to tomb, we are bound to others. Past and present. And by each crime and every kindness, we birth our future.");
            System.out.println("Nodes created");

            user1.createRelationshipTo(user2, RelTypes.FOLLOWEDBY);
            user1.createRelationshipTo(user2, RelTypes.FOLLOWEROF);
            user1.createRelationshipTo(user3, RelTypes.FOLLOWEDBY);
            user1.createRelationshipTo(user3, RelTypes.FOLLOWEROF);

            user2.createRelationshipTo(user1, RelTypes.FOLLOWEDBY);
            user2.createRelationshipTo(user1, RelTypes.FOLLOWEROF);
            user2.createRelationshipTo(user3, RelTypes.FOLLOWEDBY);
            user2.createRelationshipTo(user3, RelTypes.FOLLOWEROF);

            user3.createRelationshipTo(user2, RelTypes.FOLLOWEDBY);
            user3.createRelationshipTo(user2, RelTypes.FOLLOWEROF);
            user3.createRelationshipTo(user1, RelTypes.FOLLOWEDBY);
            user3.createRelationshipTo(user1, RelTypes.FOLLOWEROF);

            System.out.println("relationship created");

            //select nodes using index
            for(int i=1;i<=3;i++)
            {
                Node user,tweet;
                ResourceIterator nodelist1 = graphDb.findNodesByLabelAndProperty( DynamicLabel.label( "USER" ), "Userid", i).iterator();
                ResourceIterator nodelist2 = graphDb.findNodesByLabelAndProperty( DynamicLabel.label( "TWEET" ), "Tweetid", i).iterator();
                user=nodelist1.next();
                tweet=nodelist2.next();
                user.createRelationshipTo(tweet, RelTypes.TWEETED);
                tweet.createRelationshipTo(user, RelTypes.TWEETED_BY);
            }   
            tx.success();
        }
               
        try ( Transaction tx = graphDb.beginTx() )
        {
               
               ExecutionEngine engine = new ExecutionEngine(graphDb);
               for(int i=1;i<=3;i++)
               {
                ExecutionResult  result=engine.execute( "match (n {Userid: '"+i+"'}) return n" );
                Iterator n_column = result.columnAs( "n" );
                for ( Node node : IteratorUtil.asIterable( n_column ) )
                        {
                            node.setProperty("type", "user");
                        }
               }
               for(int i=1;i<=3;i++)
               {
                ExecutionResult  result=engine.execute( "match (n {Tweetid: '"+i+"'}) return n" );
                Iterator n_column = result.columnAs( "n" );
                for ( Node node : IteratorUtil.asIterable( n_column ) )
                        {
                            node.setProperty("type", "tweet");
                        }
                           
            
                }
               tx.success();
        }             
    }
        
    void removeData()
    {
        try ( Transaction tx = graphDb.beginTx() )
        {         
            for(int i=1;i<=3;i++)
                   {
                       Node user,tweet;
                       ResourceIterator nodelist1 = graphDb.findNodesByLabelAndProperty( DynamicLabel.label( "USER" ), "Userid", i).iterator();
                       ResourceIterator nodelist2 = graphDb.findNodesByLabelAndProperty( DynamicLabel.label( "TWEET" ), "Tweetid", i).iterator();
                       user=nodelist1.next();
                       tweet=nodelist2.next();
                       user.delete();
                       tweet.delete();
                   }

            tx.success();
        }
    }

    void shutDown()
    {
        System.out.println();
        System.out.println( "Shutting down database ..." );
        // START SNIPPET: shutdownServer
        graphDb.shutdown();
        // END SNIPPET: shutdownServer
    }

    // START SNIPPET: shutdownHook
    private static void registerShutdownHook( final GraphDatabaseService graphDb )
    {
        // Registers a shutdown hook for the Neo4j instance so that it
        // shuts down nicely when the VM exits (even if you "Ctrl-C" the
        // running application).
        Runtime.getRuntime().addShutdownHook( new Thread()
        {
            @Override
            public void run()
            {
                graphDb.shutdown();
            }
        } );
    }
    // END SNIPPET: shutdownHook

    private static void deleteFileOrDirectory( File file )
    {
        if ( file.exists() )
        {
            if ( file.isDirectory() )
            {
                for ( File child : file.listFiles() )
                {
                    deleteFileOrDirectory( child );
                }
            }
            file.delete();
        }
    }
    
    private  String[] parseDataRow (String row,int len)
    {
        String properties[] = new String[len];
        row = row.substring(1, row.length()-1);
        //System.out.println(row);
        for(int i=0;i
        {
            //System.out.println(i);
            if(row.charAt(0)=='u')
            {
                if(i!=len-1)
                {
                    boolean flag=false;
                    if(flag=(row.charAt(2)==','))
                    {
                        row = "u"+row.charAt(1)+row.substring(3);
                    }
                    properties[i]=row.substring(2, row.indexOf(row.charAt(1)+","));
                    if(flag)
                    {
                        properties[i] = ","+properties[i];
                    }
                    //System.out.println(properties[i]);
                    row=row.substring(row.indexOf(row.charAt(1)+",")+3);
                    //System.out.println(row);
                }
                else
                {
                    properties[i]=row.substring(2,row.length()-1);
                    //System.out.println(properties[i]);
                }
                
            }
            else
            {
                if(i!=len-1)
                {
                    properties[i]=row.substring(0, row.indexOf(","));
                   //System.out.println(properties[i]);
                    row=row.substring(row.indexOf(",")+2);
                    //System.out.println(row);
                }
                else               
                {
                    properties[i]=row;
                    //System.out.println(properties[i]);
                }
                
            }
        }
        return properties;
    }
    
    
}


Net-beans project implementing the source code can be found  here

The output of the project will be created in folder blog neo4j\target\neo4j-hello-db 
the data base can be viewed in  neo4j browser

sample output

    


Wednesday, October 9, 2013

Advanced Databases assessment 1(October 2013)

Answer all questions
Part A(3 X 2 = 6)
1) Give the importance of aggregation in ER model.
2)What do you mean by an insertion anomaly in normalization?
3)State objective of distributed query processing using the semi join operation.

Part B(9 + 10 = 19)
4) Consider the following relations for a database that keeps track of student enrollment in courses and the books adopted for each course:
student(SSN,Name,Major,Bdate)
course(course#,Cname,Dept)
Enroll(SSN,Course#,Semester,Grade)
Book_Adoption(course#,Semester,Book_ISBN)
Text(Book_ISBN,Book_Title,Publisher,Author)

Draw an Extended ER diagram and convert in to relational schema diagram with all integrity constraints.Normalize the database upto 3NF.(9)

5)Using Hotel schema given below,draw an initial relational algebra query tree for the query and use the heuristic rules to optimize that tree into a more efficient final query tree.Discuss each step and state any transformation rules used in the process.

Hotel Schema:
Hotel (hotelNo,hotelName,city)
Room (roomNo,hotelNo,type,price)
Booking (hotelNo,guestNo,datefrom,daateTo,roomNo)
Guest (guestNo,guestName,guestAddress)

query
Select g.guestNo,g.guestName
from Room r,Hotel h,Booking b,Guest g
where h.hotelNo=b.hotelNo AND g.guestNo= b.guestNo AND
h.hotelNo = r.hotelNo AND h.hotelName = 'GPH' AND
dateFrom >= '1-Jan-13' AND dateTo <= '31-June-13'        (10)

 (OR)

6) Do all types of fragmentation using TEXT relation in Q.No 4              (10)