1. 程式人生 > >Java連線Neo4j

Java連線Neo4j

一、使用jdbc連線

      使用jdbc連線沒有大變化,使用的時候和mysql過程比較類似,除了Cypher

Class.forName("org.neo4j.jdbc.Driver");
		String url ="jdbc:neo4j:http://localhost:7474";
		Connection conn = DriverManager.getConnection(url, username, password);
		
		Statement stmt = conn.createStatement();
		ResultSet rs = stmt.executeQuery("match (n) return n.age,n.name,n");
		while(rs.next()) {
			System.out.println(rs.getString("n.name")+"\t"+rs.getString("n.age"));
			System.out.println("rs.getString(\"n\")\t"+rs.getString("n"));
			System.out.println("rs.getString(2)\t"+rs.getString(2));
			System.out.println("rs.getString(3)\t"+rs.getString(3));
		}

二、使用GraphDatabase連線

其中用到的Values.parameters(),可以先生成一個數組(一般為Object[]型別),其中奇數項為引數名,偶數項為引數值,返回值為Value型別,以下是原始碼:

    public static Value parameters( Object... keysAndValues )//不定長引數的傳遞通過陣列實現
    {
        if ( keysAndValues.length % 2 != 0 )
        {
            throw new ClientException( "Parameters function requires an even number " +
                                       "of arguments, " +
                                       "alternating key and value. Arguments were: " +
                                       Arrays.toString( keysAndValues ) + "." );
        }
        HashMap<String,Value> map = newHashMapWithSize( keysAndValues.length / 2 );
        for ( int i = 0; i < keysAndValues.length; i += 2 )
        {
            Object value = keysAndValues[i + 1];
            assertParameter( value );
            map.put( keysAndValues[i].toString(), value( value ) );
        }
        return value( map );
    }
即可有類似如下寫法:
String message = "message";
String message2= "message2";
	                	Object[] obj= new Object[] {"message", message,"message2",message2};
	                	Value v =Values.parameters( obj );//傳入到parameters方法中的是陣列
	                    StatementResult result = tx.run( "CREATE (a:Greeting) " +
	                                                     "SET a.message = $message,a.message2=$message2 " +
	                                                     "RETURN a.message + ', from node ' + id(a)",
	                                                     v );

以下是官網扒的demo稍作修改:
import java.util.List;
import org.neo4j.driver.v1.AuthTokens;
import org.neo4j.driver.v1.GraphDatabase;
import org.neo4j.driver.v1.Record;
import org.neo4j.driver.v1.Session;
import org.neo4j.driver.v1.StatementResult;
import org.neo4j.driver.v1.Transaction;
import org.neo4j.driver.v1.TransactionWork;
import org.neo4j.driver.v1.Values;
import org.neo4j.driver.v1.Driver;

public class GraphDatabaseConnection implements AutoCloseable {
	private final Driver driver;
	
	public GraphDatabaseConnection() {
		//default port is 7687
		String uri="bolt://localhost:7687";
		driver = GraphDatabase.driver(uri,AuthTokens.basic(username,password));
	}
	public void close() {
		 driver.close();
	}
	 public void printGreeting( final String message )
	    {
	        try ( Session session = driver.session() )
	        {
	            String greeting = session.writeTransaction( new TransactionWork<String>()
	            {
	                @Override
	                public String execute( Transaction tx )
	                {
	                	String statementTemplate="MATCH (n) RETURN n.name,n.age,n LIMIT 25";
	                    /*StatementResult result = tx.run( "CREATE (a:Greeting) " +
	                                                     "SET a.message = $message " +
	                                                     "RETURN a.message + ', from node ' + id(a)",
	                                                     Values.parameters( "message", message ) );
	                    return result.single().get( 0 ).asString();*/
	                	StatementResult result = tx.run(statementTemplate);
	                	List<Record> resultList = result.list();
	                	String resultString="";
	                	for (Record record : resultList) {
	                		System.out.println(record.get("n.name")+"\t"+record.get("n.age"));
	                		System.out.println(record.get("n").get("name")+"\t"+record.get("n").get("age"));
	                		resultString=resultString+"\n\t"+record.get(0).toString()+record.get(1).toString();
						}	                	
						return resultString;                	
	                }
	            } );
	            System.out.println( greeting );
	        }
	    }
	 
	 public static void main( String... args ) throws Exception
	    {
	        try ( GraphDatabaseConnection greeter = new GraphDatabaseConnection() )
	        {
	            greeter.printGreeting( "hello, world" );
	        }
	    }
}

    關於GraphDatabase連線方式,其實官網有demo點選開啟連結,只是有一處將Values.parameters寫成了parameters導致不能使用。

先匯入neo4j-jdbc-driver-x.x.x.jar驅動包到專案,同時注意後續類都使用這個包裡面的類(即org.neo4j.driver開頭的類) 

註釋掉的部分是 官網demo點選開啟連結的部分內容。