图数据库neo4j学习笔记(2)
利用java API调用neo4j
有多种方式比如:使用graphDatabase.driver自己加载驱动方式
使用嵌入式数据库graphDatabaseFactor.XXXXX抽象工厂方式创建
还可以使用spring封装的data形式既SDN。
公司直接使用driver进行加载所以先学习这种方式
创建简单连接驱动
简单示例代码:
import org.neo4j.driver.v1.*;
import static org.neo4j.driver.v1.Values.parameters;
public class GraphDatabaseHelloWorld {
public GraphDatabaseHelloWorld(String uri, String user, String password)
{
driver = GraphDatabase.driver(uri, AuthTokens.basic(user, password));
}
private void addPerson(String name)
{
try (Session session = driver.session())
{
try (Transaction tx = session.beginTransaction())
{
tx.run("MERGE (a:Person {name: {x}})", parameters("x", name));
tx.success();
}
}
}
private void updatePerson(String name){
try(Session session = driver.session()){
session.run("match (a:Person) set a.name = $x", parameters("x", name));
}
}
private void printPeople(String initial)
{
try (Session session = driver.session())
{
StatementResult result = session.run(
"MATCH (a:Person) WHERE a.name STARTS WITH {x} RETURN a.name AS name",
parameters("x", initial));
while (result.hasNext())
{
Record record = result.next();
System.out.println(record.get("name").asString());
}
}
}
public void close()
{
driver.close();
}
public static void main(String... args)
{
GraphDatabaseHelloWorld example = new GraphDatabaseHelloWorld("bolt://localhost:7687", "neo4j", "123321");
example.addPerson("Ada");
example.addPerson("Alice");
example.addPerson("Bob");
example.printPeople("A");
example.close();
}
}
下面是代码解释:
Driver driver = null;
driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ) );
Uri为一个固定的连接路径比如:bolt://localhost:7687由你的neo4j的配置决定。这是一个直接的连接方式,当需要连接有路由选择的时候需要使用bolt+routing的形式,比如:bolt+routing://neo01.graph.example.com?policy=europe
AuthTokens.basic(user,password)是简单的认证方式。User和password是你的数据库帐号和密码
driver=GraphDatabase.driver(uri,AuthTokens.kerberos(ticket));
这是使用kerberos连接方式使用的是base64的加密字段加载驱动。
driver=GraphDatabase.driver(uri,AuthTokens.basic(user,password),Config.build().withTrustStrategy(Config.TrustStrategy.trustAllCertificates()).toConfig());
通过证书的方式加载更加安全。
driver=GraphDatabase.driver(uri,AuthTokens.basic(user,password),Config.build()
.withMaxConnectionLifetime(30,TimeUnit.MINUTES)
.withMaxConnectionPoolSize(50)
.withConnectionAcquisitionTimeout(2,TimeUnit.MINUTES)
.toConfig());
建立连接池的方式,配置解释从第一个到最后如下:
1. 连接空闲时存活最长时间
2. 连接池最大连接数
3. 连接请求超时时间
driver=GraphDatabase.driver(uri,AuthTokens.basic(user,password),Config.build()
.withLoadBalancingStrategy(Config.LoadBalancingStrategy.LEAST_CONNECTED)
.toConfig());
设置负载均衡策略有两种模式:least-connected和round-robin。
driver=GraphDatabase.driver(uri,AuthTokens.basic(user,password),Config.build().withMaxTransactionRetryTime(15,SECONDS).toConfig());
设置最长重连时间
try(Sessionsession=driver.session()){
session.run("CREATE (a:Person{name:$name})",parameters("name",name));
}
获取会话和运行语句,没有设置事物,默认自动提交
private void addPerson(String name)
{
try (Session session = driver.session())
{
try (Transaction tx = session.beginTransaction())
{
tx.run("MERGE (a:Person {name: {x}})", parameters("x", name));
tx.success();
}
}
}
private void updatePerson(String name){
try(Session session = driver.session()){
session.run("match (a:Person) set a.name = $x", parameters("x", name));
}
}
解释:增加一个节点
private void updatePerson(String name){
try(Session session = driver.session()){
session.run("match (a:Person) set a.name = $x", parameters("x", name));
}
}
解释:修改Person标签下的节点
private void printPeople(String initial)
{
try (Session session = driver.session())
{
StatementResult result = session.run(
"MATCH (a:Person) WHERE a.name STARTS WITH {x} RETURN a.name AS name",
parameters("x", initial));
while (result.hasNext())
{
Record record = result.next();
System.out.println(record.get("name").asString());
}
}
}
解释:查询Person标签下面的节点的name属性