Neo4j 使用指南

  • 2019 年 10 月 28 日
  • 筆記

版權聲明:本文為部落客原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。

本文鏈接:https://blog.csdn.net/y_silence_/article/details/102758086

目錄

  • Neo4j 調用
    • 添加約束
    • 調用前預熱
    • 標籤查詢
    • 創建索引
    • 刪除索引和約束
  • Neo4j 管理
    • Neo4j 性能優化
    • 性能結果回饋
  • python3 與 neo4j
  • Neo4j 指令
    • 創建
    • 刪除
    • 更新
    • 查詢
  • 資源

Neo4j 調用

添加約束

CREATE CONSTRAINT ON (book:Book) ASSERT book.isbn IS UNIQUE;  CREATE CONSTRAINT ON (book:Book) ASSERT exists(book.isbn);  CREATE CONSTRAINT ON ()-[like:LIKED]-() ASSERT exists(like.day);  CREATE CONSTRAINT ON (n:Person) ASSERT (n.firstname, n.surname) IS NODE KEY;

節點屬性值唯一約束(Unique node property):如果節點具有指定的標籤和指定的屬性,那麼這些節點的屬性值是唯一的 節點屬性存在約束(Node property existence):創建的節點必須存在標籤和指定的屬性 關係屬性存在約束(Relationship property existence):創建的關係存在類型和指定的屬性 節點鍵約束(Node Key):在指定的標籤中的節點中,指定的屬性必須存在,並且屬性值的組合是唯一的

請注意,屬性存在約束只能在 Neo4j 企業版中使用。

調用前預熱

graph.run('MATCH (n) OPTIONAL MATCH (n)-[r]->() RETURN count(n.query_address) + count(r.query_address)')

標籤查詢

在圖形結構中,標籤用於對節點進行分組,相當於節點的類型,擁有相同標籤的節點屬於同一個分組。一個節點可以擁有零個,一個或多個標籤,因此,一個節點可以屬於多個分組。對分組進行查詢,能夠縮小查詢的節點範圍,提高查詢的性能。

一個關係僅有一個關係類型。

創建索引

在查詢被索引的屬性時,Neo4j自動應用索引,以獲得查詢性能的提升。

CREATE INDEX ON :Person(firstname)  CREATE INDEX ON :Person(firstname, surname)

索引建立後只是Populating狀態,需要注意重啟資料庫,並關閉管理網頁。

查詢索引和約束

指令:schema

模式

Neo4j的模式(Schema)通常是指索引,約束和統計,通過創建模式,Neo4j能夠獲得查詢性能的提升和建模的便利。

刪除索引和約束

# 刪除索引  DROP INDEX ON :Album(name);  # 刪除約束  DROP CONSTRAINT ON (a:Artist) ASSERT a.name IS UNIQUE

Neo4j 管理

Neo4j 性能優化

優化Neo4j配置文件

  • 建議配置 用指令 bin/neo4j-admin memrec --memory=記憶體大小g 讓其建議neo4j.conf的配置
  • 更改配置 Neo4j配置文件所在位置如下

將其中相應的配置參數改為建議值。

# 舉例,給圖資料庫分配 16g 的記憶體  bin/neo4j-admin memrec --memory=16g  # 獲得的建議結果如下  dbms.memory.heap.initial_size=5g  dbms.memory.heap.max_size=5g  dbms.memory.pagecache.size=7g

性能結果回饋

EXPLAIN:是解釋機制,加入該關鍵字的Cypher語句可以預覽執行的過程但並不實際執行,所以也不會產生任何結果 PROFILE:則是畫像機制,查詢中使用該關鍵字,不僅能夠看到執行計劃的詳細內容,也可以看到查詢的執行結果

# 用於測試查詢語句的效率  profile match (n)  where n.name = 'Annie'  return n

python3 與 neo4j

from configs.conf import config as conf  from py2neo import Graph, Node, Relationship    class Neo4j_connection:        """function: used to manage Neo4j db operations"""        def __init__(self, host, user, password):          self.conn = Graph(host=host, user=user, password=password)          def create_relative(self):          a = Node("Person", name="Alice", age=33)          b = Node("Person", name="Bob", age=44)          KNOWS = Relationship.type("KNOWS")          self.conn.merge(KNOWS(a, b), "Person", "name")      if __name__ == '__main__':        # connect neo4j      g_graph = Neo4j_connection(host=conf.NEO4J_HOST, user=conf.NEO4J_USER, password=conf.NEO4J_PASSWD)      g_graph.create_relative()

Neo4j 指令

創建

創建節點

CREATE (n:Person{Person:'kk'}) return n;

創建關係

# 未帶值的關係  MATCH (n),(m) WHERE n.id ="a" AND m.id = "b" CREATE (n)-[:TO]->(m)  # 帶值的關係  MATCH (n),(m) WHERE n.Person ="jj" AND m.Person = "kk" CREATE (n)-[:TO{value: "1"}]->(m)

創建完整的 Path

由於Path是由節點和關係構成的,當路徑中的關係或節點不存在時,Neo4j會自動創建

CREATE p =(vic:Worker:Person{ name:'vic',title:"Developer" })-[:WORKS_AT]->(neo)<-[:WORKS_AT]-(michael:Worker:Person { name: 'Michael',title:"Manager" })  RETURN p

刪除

刪除關係

MATCH (:Person {id: "a"})-[r:KNOWS]-(:Person {id: "b"})  DELETE r

清空資料庫

match (n) detach delete n

更新

為節點增加屬性

match (n)  where id(n)=7  set n.name = 'neo'  return n;

為節點增加標籤

match (n)  where id(n)=7  set n:Company  return n;

為關係增加屬性

match (n)<-[r]-(m)  where id(n)=7 and id(m)=8  set r.team='Azure'  return n;

查詢

查詢所有節點

MATCH (n) RETURN n

查詢所有關係

MATCH ()-[r]->() RETURN r

資源

官方文檔 中文社區