简介
Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。
它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。
Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。
程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。
Neo4j因其嵌入式、高性能、轻量级等优势,越来越受到关注.
Docker 部署
docker run -d --name neo4j \
--publish=7474:7474 --publish=7687:7687 \
neo4j
docker部署neo4j,支持x86和arm64;
7474是brower的端口:localhost:7474,7687是api
登陆brower
初始用户名与密码均为 neo4j,第一次登陆会先修改密码
Java客户端
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>4.4.2</version>
</dependency>
简单demo
public class Neo4jTest implements AutoCloseable{
private final Driver driver;
public Neo4jTest(String uri, String user, String password) {
driver = GraphDatabase.driver( uri, AuthTokens.basic( user, password ) );
}
@Override
public void close() throws Exception {
driver.close();
}
public void printGreeting( final String message )
{
try ( Session session = driver.session() )
{
String greeting = session.writeTransaction( tx ->
{
Result result = tx.run( "CREATE (a:Greeting) " +
"SET a.message = $message " +
"RETURN a.message + ', from node ' + id(a)",
new HashMap<String, Object>(){{
put("message", message);
}});
return result.single().get( 0 ).asString();
} );
System.out.println( greeting );
}
}
public static void main( String... args ) throws Exception
{
try ( Neo4jTest greeter = new Neo4jTest( "bolt://localhost:7687", "neo4j", "123456" ) )
{
greeter.printGreeting( "hello, world" );
}
}
}
这个时候你可以在brower上看到创建的节点:
简单语法
neo4j的官方语法称为 Cypher
:The Neo4j Cypher Manual v4.4
neo4j的呈现形式:Neo4j中不存在表的概念,只有两类:节点(Node)和关系(Relation),可以简单理解为图里面的点和边。
在数据查询中,节点一般用小括号(),关系用中括号[]。
当然也隐含路径的概念,是用节点和关联表示的,如:(a)-[r]->(b),表示一条从节点a经关联r到节点b的路径。
关系:neo4j中是单向关系,严格的来说不具备双向或者无向的关系。但是merge (a)-[r]-(b)这样的语句创建的关系可以理解为是双向的,但是neo4j中比较尴尬的一点是这样可以理解为无向关系的关系,在web呈现时是带着单向箭头的。
属性:节点和关系都可以具备属性。
标签:代表节点的类型,一个节点可以有0个、1个或者多个标签。
类型:代表关系的类型,一条关系可以有0个或者1个,一条边不能具有多个type。
CREATE (adam:User { name: 'Adam' }),(pernilla:User { name: 'Pernilla' }),(david:User { name: 'David'}),(adam)-[:FRIEND]->(pernilla),(pernilla)-[:FRIEND]->(david)
执行后:
更多详情参考:Neo4j Cypher语法
数据导入
目前neo4j的数据还是本地导入,通过自带的neo4j-import工具,导入的数据为csv文件,详情参考