简介

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的官方语法称为 CypherThe 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文件,详情参考

最后修改:2022 年 02 月 27 日