.netcore docker noe4j

1.借用docker搭建noe4j環境html

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數據庫會拋出錯誤,執行失敗。node

1,鏈接數據庫docker

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以後,以自動提交模式執行事務,在數據庫中建立一個節點,該節點具備標籤和屬性。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或編寫一次性腳本時。 建議不要在生產環境中使用自動提交事務,或者在性能或彈性是主要問題時使用。ide

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使用簡單例子(轉)

相關文章
相關標籤/搜索