• .netcore docker noe4j


    1.借用docker搭建noe4j环境

    docker pull neo4j
    docker run -d  --restart=always  -p7474:7474 -p7687:7687 -v /root/docker/neo4j/data:/data  -v /root/docker/neo4j/logs:/logs  --env=NEO4J_AUTH=neo4j/password --name neo4j  neo4j

     

     

    驱动程序主要方法和对象

    Neo4j驱动程序最核心的对象是:Driver对象,Session对象和Transaction对象。Driver对象用于连接数据库,Session对象用于创建事务,事务对象用于执行Cypher查询。事务只能在Read或Write模式下执行,由于Driver对象不会解析Cypher查询,它也不会检测到事务执行的是写,还是读操作,因此,当一个写模式事务执行的是读操作,Neo4j数据库会抛出错误,执行失败。

    1,连接数据库

    Neo4j通过Driver对象来连接图形数据库,在创建Driver对象时,需要服务器的连接地址(即bolt监听地址,地址格式是"bolt://host:7687")和身份验证信息:user和password。

     private readonly IDriver Driver;
     public Neo4jProviders(string uri, string user, string password)
     {
        Driver = GraphDatabase.Driver(uri, AuthTokens.Basic(user, password));
     }

    验证信息通过auth token来提供,基础验证是AuthTokens.Basic(user,password)。

    2,创建会话(Session)

    在连接图形数据库之后,创建会话,会话是一系列事务(Transaction)的容器,用于创建事务执行的上下文,也就是说,事务必须在session的上下文中执行。Neo4j驱动程序提供三种格式的事务,最简单的是自动提交事务模式,自动提交事务模式使用 Session对象的run()方法来实现。

    示例代码如下,在创建Session之后,以自动提交模式执行事务,在数据库中创建一个节点,该节点具有标签和属性。

    public void AddPerson(string name)
    {
        using (var session = Driver.Session())
        {
            session.Run("CREATE (a:Person {name: $name})", new { name });
        }
    }

    在Neo4j的驱动程序中,发送到Neo4j数据库引擎的Cypher查询语句包含两部分:Query和Parameters,其中,Query是在数据库中执行的Cypher语句,Parameters是传递引擎的参数,在Query中以$para_name格式来引用参数,在Parameters中,参数的名词和$para_name中的para_name保持一致。

    自动提交事务只包含一个Cypher语句,这意味着多个事务不能共享网络数据包,从而表现出比其他形式的事务更低的网络效率。自动提交事务旨在用于简单的用例,例如学习Cypher或编写一次性脚本时。 建议不要在生产环境中使用自动提交事务,或者在性能或弹性是主要问题时使用。

    3,创建事务函数

    事务函数是推荐的创建事务的方式,这种形式能够以最小的查询代码实现多个多个查询的输入,能够分离数据库查询和应用程序逻辑。

    在Neo4j的事务中,读写操作都必须处于事务的上下文中。在Session对象中,当事务以自动提交模式执行(通过session.Run()函数调用)时,事务只包含一个Cypher语句,但是,这种模式有一个缺点,当Cypher语句执行失败时,事务不能重新执行(Replay)。Neo4j推荐使用事务函数模式,通过Session对象调用WriteTransaction()或 ReadTransaction()函数,并在事务函数包含事务单元,在事务执行失败时,能够在异常处理代码中重新执行Cypher语句。

    public void AddPerson(string name)
    {
        using (var session = Driver.Session())
        {
            session.WriteTransaction(tx => tx.Run("CREATE (a:Person {name: $name})", new { name }));
        }
    }

    三,参数化查询

    Cypher支持参数化查询,在Cypher语句中,使用参数替代表达式,实体的ID,参数不能用于关系类型和标签。在Neo4j数据库中,参数能够优化查询,使得Cypher的执行计划更容易被缓存,查询更快速。在Cypher中,通过$param引用参数。

    1,使用参数创建节点

    在执行事务之后,Session返回数据库执行的结果,通过result.Summary查看Cypher语句执行的结果。

    public bool CreateSingleNode(string lable, string name)
    {
        string query = string.Format("CREATE (n:{0} ", lable) + @"{name: $name})";
        using (var session = Driver.Session(AccessMode.Write))
        {
            var result = session.WriteTransaction(tx => tx.Run(query, new { name }));
            IResultSummary rs = result.Summary;
            return rs.Counters.NodesCreated == 1;
        }
    }

    2,使用参数创建关系

    通过new创建匿名类型,参数名是匿名类型的字段,字段名必须和Cypher语句中的参数($para)保持一致。

    public bool CreateRelationship(string RelationshipType, string SourceNodeName, string TargetNodeName)
    {
        string query = string.Format(@"match (n),(m) where n.name=$source and m.name=$target create (n)-[:{0}]->(m);", RelationshipType);
    
        using (var session = Driver.Session())
        {
            var result = session.WriteTransaction(tx => tx.Run(query, new { source = SourceNodeName, target = TargetNodeName }));
            IResultSummary rs = result.Summary;
            return rs.Counters.RelationshipsCreated == 1;
        }
    }

    四,查询数据库

    向Neo4j数据库发送请求,返回的是数据结构是一个表格,Title是return子句的投影的字段。

     

    如示例图所示,查询返回的结构是表格(行-列)式的,列值主要分为两种,要么是节点的属性列表,以JSON结构显示,要么是标量值。

    驱动程序的Session返回查询的结果,Keys字段是Cypher语句中return子句投影的字段列表;Values字段返回是查询结果。

    public void MatchNodes(string lable, string name)
    {
        string query = string.Format(@"MATCH (n:{0} ", lable) + @"{name: $name})-[r]->(m) RETURN n,id(n);";
        using (var session = Driver.Session(AccessMode.Read))
        {
            var result = session.ReadTransaction(rx => rx.Run(query, new { name }));
            //return 子句投影的字段列表
            IReadOnlyList<string> keys = result.Keys;
            //查询返回的数据行
            var rows = result.ToList();
            foreach (var row in rows)
            {
                //每个数据行都包含多个数据列
                var columns = row.Values;
                foreach (var column in columns)
                {
                    //每个数据列,可能是一个节点,也可能是一个标量值
                    if (column.Key == "n")
                    {
                        var node = column.Value as INode;
    
                        long NodeID = node.Id;
                        string NodeLables = string.Join(",", node.Labels.ToArray());
                        foreach (var property in node.Properties)
                        {
                            string Property = string.Format("Property[Key:{0},Value:{1}", property.Key, property.Value);
                        }
                    }
    
                    if (column.Key == "id(n)")
                    {
                        long NodeID = long.Parse(column.Value.ToString());
                    }
                }
            }
        }
    }
    public List<string> GetPeople()
    {
        using (var session = Driver.Session())
        {
            //return session.ReadTransaction(tx => tx.Run("MATCH (a:Person) RETURN a.name AS name").ToList());
            return session.ReadTransaction(tx =>
            {
                var result = tx.Run("MATCH (a:Person) RETURN a.name ORDER BY a.name");
                return result.Select(record => record[0].As<string>()).ToList();
            });
        }
    }

    参考:

    Neo4j 第四篇:使用.NET驱动访问Neo4j

    Neo4j使用简单例子(转)

  • 相关阅读:
    杭电 Problem
    杭电Problem 5053 the sum of cube 【数学公式】
    杭电 Problem 2089 不要62 【打表】
    杭电 Problem 4548 美素数【打表】
    杭电 Problem 2008 分拆素数和 【打表】
    杭电 Problem 1722 Cake 【gcd】
    杭电 Problem 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心】
    杭电Problem 1872 稳定排序
    杭电 Problem 1753 大明A+B
    东北林业大 564 汉诺塔
  • 原文地址:https://www.cnblogs.com/majiang/p/11481652.html
Copyright © 2020-2023  润新知