天天看點

(一)neo4j 之 cypher常用文法cypher語言說明

neo4j 圖資料庫之 cypher常用文法

  • cypher語言說明
    • CQL資料類型
    • 删除語句
    • 建立節點語句
    • 建立關系語句
    • 查詢庫資訊語句
    • 查詢資料語句
    • 全文索引
    • 配置檔案
    • 權限配置
    • 清空資料庫

cypher語言說明

cypher 是neo4j聲明式聲明式查詢語言,簡稱CQL。它遵循SQL文法,非常簡單并且具有可讀性的結構化格式。

CQL資料類型

類型 說明
boolean 用于表示布爾文字:true,false。
byte 用于表示8位整數。
short 用于表示16位整數。
int 用于表示32位整數。
long 用于表示64位整數。
float 用于表示32位浮點數。
double 用于表示64位浮點數。
char 用于表示16位字元。
String 用于表示字元串。

删除語句

  • 删除所有節點及其關系
MATCH (a) OPTIONAL MATCH (a)-[r]-() DELETE a,r
           
  • 删除某個節點
MATCH (a:student)  DELETE a
           
  • 删除屬性
  • 删除屬性
MATCH (a:student)  REMOVE a.name
           
  • 删除關系
MATCH (a:student1)-[r:test_graph]-(a:student2)  DELETE r
           

建立節點語句

  • 建立一個空節點
  • 建立一個帶有lable節點
  • 建立節點并配置設定屬性
CREATE (a:student{age:18,name:'張三'}) RETURN *  //注意:在已有的節點且屬性相同會重複建立
MERGE (a:student{age:18,name:'張三'}) RETURN * //注意:沒有此節點會建立立,已有此節點且屬性相同會融合,已有此節點且屬性值包含建立語句的屬性值不會新建立,已有此節點且屬性不同會建立立
MERGE (a:student{age:18,name:'張三',nick:['三三','小三']}) RETURN *
           
  • 批量建立節點并且配置設定屬性
UNWIND [{name:"李四"},{name:"張三"}] AS nodes CREATE (student) SET student= nodes
           
  • 新增、更新屬性
MERGE (a:student{name:'張三'}) ON CREATE SET a.age='19' RETURN *  //注意:已有節點時屬性不會建立和更新,未有節點會建立
MERGE (a:student{name:'張三'}) SET a.age='19' RETURN *  //新增、更新
//合并
MERGE (n:student{name: '張三'}) 
  ON CREATE SET n.age = 20
  ON MATCH SET  n.age = 20
           
  • 建立多lable
  • 在已有節點上添加新lable
MATCH (a{name:'張三'}) SET a:person RETURN a  //添加一個标簽
MATCH (a{name:'張三'}) SET a:person:student RETURN a //添加一個标簽
           

建立關系語句

  • 建立兩個節點同時建立一個關系,給兩個節點建立關系,指定關系類型、方向和屬性。
  • 在已有兩個節點基礎上建立關系,指定關系類型、方向和屬性。
//注意:多次執行該語句使用 `CREATE` 會重複建立關系, 非重複建立使用 `MERGE` 即可 
MATCH (a:student{name:"李四"}),(b:student{name:"張三"})  CREATE (a)-[r:test_graph]->(b) return * 
           
  • 在已有兩個節點基礎上建立關系,關系上附加屬性。

查詢庫資訊語句

  • 幫助
:help
           
  • 查詢所有關系類型、節點标簽
call db.propertyKeys
call db.labels
           
  • 檢視資料庫結構
  • 檢視連接配接資訊
  • 檢視系統資訊
:play sysinfo
           
  • 檢視所有lables
  • 查詢所有的type
  • 查詢庫内有多少個節點
  • 查詢有多少關系,不帶方向的話結果為2倍
MATCH ()-->() RETURN count(*);
MATCH ()-[r]->() RETURN count(r); 
           

查詢資料語句

  • 查詢(

    所有節點及其關系

  • 查詢(

    孤立節點,及無關系節點

  • 查詢(

    比對結果集中如果有丢的部分,則會用null來補充

OPTIONAL MATCH (n)-[r]->(m) RETURN m
           
  • 查詢(

    所有标簽為 student 的節點

  • 查詢(

    多标簽節點

  • 查詢(

    标簽為 student 并且屬性為 age=18 的所有節點

MATCH (a:student) WHERE a.age = 18 RETURN * 
//或者 
MATCH (a:student{age:18}) RETURN *
           
  • 查詢(

    節點 Id

MATCH (a:student) WHERE id(a)=2 RETURN *
MATCH (a:student) RETURN ID(a)
           
  • 查詢(

    比對屬性字元串的開頭關鍵詞 STARTS WITH

MATCH (a) WHERE a.name STARTS WITH '張' RETURN a
           
  • 查詢(

    比對屬性字元串的結尾關鍵詞 ENDS WITH

MATCH (a) WHERE a.name ENDS WITH '三' RETURN a
           
  • 查詢(

    比對屬性字元串的結尾關鍵詞 ENDS WITH

MATCH (a) WHERE a.name ENDS WITH '三' RETURN a
           
  • 查詢(

    比對屬性字元串的不包含關鍵詞 CONTAINS

MATCH (a) WHERE NOT a.name CONTAINS '三' RETURN a
           
  • 查詢(

    支援正規表達式

MATCH (a) WHERE a.name =~'.*三.*' RETURN a
           
  • 查詢(

    屬性不為空

  • 查詢(

    Coalesce

  • 查詢(

    條件 IN、與、或、NOT、NULL

MATCH (a:student) WHERE a.age IN [18,17,20] AND a.name IS NOT NULL OR a.age IS NULL RETURN *
MATCH (a:student) WHERE NOT a.age IN [18,17,20] RETURN *
MATCH (a:student) WHERE NOT (a)-[]-() DELETE a
           
  • 查詢(

    排序

  • 查詢(

    分頁

  • 查詢(

    計算 最大值、最小值、平均值、和、統計

//注意age為數值等可計算字段且不為空,如有為空請排除後計算
MATCH (a:student) RETURN max(a.age),min(a.age),avg(a.age),sum(a.age),count(a.age) 
           
  • 查詢(

    分組、聚類數量、相異去重

MATCH (a:student) WITH COLLECT(distinct a.name) as c WHERE SIZE(c)<20  RETURN * 
MATCH (a:student) WITH TYPE(a.age) AS t,COLLECT(distinct a.name) as c WHERE SIZE(c)<20  RETURN * 
           
  • 查詢(

    關系、過濾

//無指定方向和關系
MATCH (a:student)-[]-(b:student) RETURN * 
//指定方向和關系
MATCH (a:student)-[:test_graph]->(b:student) RETURN * 
//指定方向和關系,并且傳回指定屬性 name 和關系類型以 t 開頭的關系資料
MATCH (a:student)-[]->(b:student) WHERE a.name ='李四' and TYPE(r)=~ 't.*'  RETURN * 
MATCH (a{ name: '張三' }),(b)  WHERE b.name IN ['李四','王五'] AND (a)<--(b)  RETURN b
//傳回任意關系為 test_graph 和 belong 的所有節點關系
MATCH p=(a)-[:test_graph|:belong]->(b) RETURN p 
//關系屬性範圍過濾
MATCH (a)-[r:test_graph]->(b) WHERE r.influence < 2000 RETURN *
           
  • 查詢(

    節點之間最短路徑

    )
MATCH n=allshortestPaths((a:student{name:"李四"})-[*]-(b:student{name:"張三"})) return n 
           
  • 查詢(

    深度關系比對

    )
//可變長度的關系
START a=node(3), x=node(2, 4) MATCH p1=a-[r:test_graph*1..3]->x RETURN a,x,length(p1)
//比對從a到b,任意關系,深度1到5的節點
MATCH p=(a)-[*1..5]->(b) RETURN p
//比對從a到b,任意關系、任意深度的節點
MATCH p=(a)-[*]->(b) RETURN p
           
  • 查詢(

    關鍵詞 All、Any、None、Single

    )
//疊代測試集合中所有元素的判斷
MATCH p=(a:student) WHERE ALL(x IN nodes(p) WHERE x.name='李四') RETURN a
MATCH (a:student) WHERE ANY(x IN a.array WHERE x.name='李四') RETURN *
//在疊代器中沒有元素判斷将傳回true
MATCH p=(a:student)-[*1..3]-() WHERE NONE(x IN nodes(p) WHERE x.name= '李四') RETURN p
//如果疊代器中僅有一個元素則傳回true
MATCH p=(a:student)-[*1..3]-() WHERE SINGLE(x in nodes(p) WHERE x.name= '李四') RETURN p 
           
  • 查詢(

    Nodes、Relationships、Extract

    )
//傳回一個路徑中的所有節點
MATCH p=(a:student)--(r:test_graph)--(b:student) RETURN nodes(p)
//傳回一條路徑中的所有關系
MATCH p=(a:student)--(r:test_graph)--(b:student) RETURN relationships(p) 
//傳回一個路徑中的所有節點
MATCH p=(a:student)--(r:test_graph)--(b:student) RETURN extract(n in nodes(p):n.name)  
           
  • 查詢(

    UNION 語句

    )
//使用UNION結果去重,求并集
MATCH (a)-[:test_graph]->(b) RETURN b.name UNION MATCH (a)-[:belong]->(b)  RETURN b.name 
//使用UNION ALL結果不去重, 求和集
MATCH (a)-[:test_graph]->(b) RETURN b.name UNION ALL MATCH (a)-[:belong]->(b)  RETURN b.name
           

//執行過程

EXPLAIN MATCH (n:LabelsTree) return *

全文索引

請跳轉下期部落格: (二)neo4j 之 全文索引

配置檔案

請跳轉下期部落格: (三)neo4j 之 配置檔案參數

權限配置

  • 建立新使用者及管理角色
功能 語句
管理者賬戶建立一個使用者

CALL dbms.security.createUser('freedom', 'admin123', true)

配置設定使用者一個角色

CALL dbms.security.addRoleToUser('publisher', 'freedom')

改變使用者密碼

CALL dbms.security.changePassword('admin456')

删除使用者的讀寫權限

CALL dbms.security.removeRoleFromUser('publisher', 'freedom')

給使用者配置設定讀資料權限

CALL dbms.security.addRoleToUser('reader', 'freedom')

  • 禁用和重新激活使用者
功能 語句
禁用

CALL dbms.security.suspendUser('freedom')

重新激活

CALL dbms.security.activateUser('freedom')

  • 通過控制台添加新使用者

    a.控制台輸入欄輸入

    :server user add

    b.設定username,setPassword,ConfirmPassword,點選AddUser

清空資料庫

删除資料 databases/graph.db