1.Neo4j數據庫的兩種方式
Neo4j可以以兩種方式運行:
- Java應用程序中的嵌入式數據庫
- 通過REST的獨立服務器
不管哪一種方式,這個選擇不會影響查詢和使用數據庫的方式。 它是由應用程序的性質(無論是獨立服務器還是客戶端服務器),性能,監視和數據安全性驅動的架構選擇。
1.1Neo4j Server(服務器式數據庫)
Neo4j Server是互操作性,安全性和監控的最佳選擇。 實際上,REST接口允許所有現代平台和編程語言與它進行互操作。 此外,作為獨立應用程序,它比嵌入式配置更安全(客戶端中的潛在故障不會影響服務器),並且更易於監控。 如果我們選擇使用這種模式,我們的應用程序將充當Neo4j服務器的客戶端。
上一篇博文中介紹的安裝Neo4j,其實就是服務器式數據庫。
要連接到Neo4j服務器,您必須使用REST API,以便您可以使用任何編程語言的REST庫訪問數據庫。 盡管可以使用任何可以發送HTTP請求的編程語言,但您也可以使用包裝REST調用的多種語言和平台編寫的聯機庫,例如Python,.NET,PHP,Ruby,Node.js等。
1.2An embedded database(內嵌式數據庫)
嵌入式Neo4j數據庫是性能的最佳選擇。 它運行在相同的客戶端應用程序的進程托管它並將數據存儲在給定的路徑中。 從而,必須以編程方式創建嵌入式數據庫。 我們選擇嵌入式數據庫出於以下原因:
- 當我們使用Java作為我們項目的編程語言時
- 當我們的應用程序是獨立的
2.程序代碼
2.1配置文件
兩種方式的連接都使用的是Maven項目,配置文件如下,注意配置文件是包括兩種方式都需要的jar包。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.neo4j</groupId>
<artifactId>conn</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>conn</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.1</version>
<scope>test</scope>
</dependency>
<dependency>
<!-- 服務器開發需要的jar包 -->
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>1.5.0</version>
</dependency>
<dependency>
<!-- 嵌入式開發需要的jar包 -->
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>3.3.4</version>
</dependency>
</dependencies>
<repositories>
<repository>
<id>neo4j</id>
<url>http://m2.neo4j.org/content/repositories/releases/</url>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</project>
2.2服務器開發的代碼
注意,使用服務器開發的方式,Neo4j必須是開啟的狀態
package com.neo4j.conn;
import org.neo4j.driver.v1.*;
import static org.neo4j.driver.v1.Values.parameters;
/** * Hello world! * */
public class App {
public static void main( String[] args ) {
Driver driver = GraphDatabase.driver( "bolt://localhost:7687", AuthTokens.basic( "neo4j", "" ) );
Session session = driver.session();
session.run( "CREATE (a:Person {name: {name}, title: {title}})",
parameters( "name", "Arthur001", "title", "King001" ) );
StatementResult result = session.run( "MATCH (a:Person) WHERE a.name = {name} " +
"RETURN a.name AS name, a.title AS title",
parameters( "name", "Arthur001" ) );
while ( result.hasNext() )
{
Record record = result.next();
System.out.println( record.get( "title" ).asString() + " " + record.get( "name" ).asString() );
}
session.close();
driver.close();
}
}
2.3嵌入式開發
package com.neo4j.conn;
import java.io.File;
import java.util.HashMap;
import java.util.Map;
import org.neo4j.cypher.internal.javacompat.ExecutionEngine;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.*;
public class Test1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
GraphDatabaseService graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(new File("Data/Test"));
System.out.println("Database Load!");
//開啟事務
try (Transaction tx = graphDb.beginTx()) {
// Perform DB operations
Node steve = graphDb.createNode(Labels.USER);
steve.setProperty("name", "Steve");
Node linda = graphDb.createNode(Labels.USER);
linda.setProperty("name", "Linda");
steve.createRelationshipTo( linda, RelationshipTypes.IS_FRIEND_OF );
System.out.println("created node name is" + steve.getProperty("name"));
tx.success();
}
//查詢數據庫
String query ="match (n:USER) return n.name as name";
Map<String, Object >parameters = new HashMap<String, Object>();
try ( Result result = graphDb.execute( query, parameters ) )
{
while ( result.hasNext() )
{
Map<String, Object> row = result.next();
for ( String key : result.columns() )
{
System.out.printf( "%s = %s%n", key, row.get( key ) );
}
}
}
registerShutdownHook(graphDb);
System.out.println("Database Shutdown!");
}
//設置標簽,但是必須繼承於接口label
public enum Labels implements Label {
USER,
MOVIE;
}
public enum RelationshipTypes implements RelationshipType {
IS_FRIEND_OF,
HAS_SEEN;
}
private static void registerShutdownHook(final GraphDatabaseService graphDb){
Runtime.getRuntime().addShutdownHook(new Thread(){
@Override
public void run(){
graphDb.shutdown();
}
});
}
}
2.4小結
這個只是快速入門了,代碼很簡單,如果想知道更詳細的介紹,請看我后續的博文。