zoukankan      html  css  js  c++  java
  • .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使用简单例子(转)

  • 相关阅读:
    怎么写好组件
    你所不知道的 URL
    响应式Web设计 – 布局
    ajax请求总是不成功?浏览器的同源策略和跨域问题详解
    滑屏 H5 开发实践九问
    UVALive
    [CQOI2018] 破解D-H协议
    [CQOI2018] 解锁屏幕
    HDU
    CodeChef
  • 原文地址:https://www.cnblogs.com/majiang/p/11481652.html
Copyright © 2011-2022 走看看