neo4j語法

圖數據庫在社交網絡、實時推薦、徵信系統、人工智能等領域有普遍應用。node

集羣特徵:主從複製,重選主服務器和容錯;每一個實例都有本身的本地緩衝數據庫

性能優點:查詢內不跨網絡;實時操做,具備快速和一致的響應時間;緩衝分區,對於很是大的圖,跨集羣擴展緩衝。瀏覽器

1. 安裝服務器

安裝如今是zip文件,解壓後要配置環境變量,管理員運行cmd後執行:neo4j install-service,管理員運行cmd後執行:neo4j start,就能夠進入瀏覽器7474界面。網絡

能夠修改config,修改裏面內存大小dbms.memory.heap.initial_size=1024moracle

dbms.memory.heap.initial_size=1024m函數

若是想實現遠程訪問,首先關閉Windows防火牆,在config中修改監聽地址爲 0.0.0.0。性能

# To accept non-local connections, uncomment this line:this

dbms.connectors.default_listen_address=0.0.0.0人工智能

2. 基本概念

標籤Label: 至關於數據表,好比Person

節點Node: 每一個標籤下能夠有N個節點Node,每一個節點表明一個對象,至關於數據表裏的一行。

關係Relation: 幾點之間的連線表明對象之間的關係。

節點和關係均可以帶若干屬性。

3. cypher語法

①建立節點

Create (erzi:Person {id:'erzi'}),(baba:Person{id:'baba'}),//erzi別名

(yeye:Person{id:'yeye', name:'zhangsan'}),

(nainai:Person{id:'nainai'}),(mama:Person{id:'mama'}),

(bozi:Person{id:'hozi'}),

(erzi)-[:father]->(baba), (baba)-[:father]->(yeye),

(baba)-[:mother]->(nainai), (erzi)-[:mother]->(mama),

(erzi)-[:girlFriend]->(bozi)

②Match查找

Match (n:Person {id:’erzi’}) Return n limit 25

或者Match (n:Person) where n.id=’erzi’  Return n limit 25

Match (n:Person) where n.id=’erzi’  Return n.name, n.id limit 25

③Merge 建立或者查詢(已經存在)

//如何給已經存在的節點添加新關係,並刪除舊關係

Match  (n:Person {id:’erzi’}) , (f:Person {id:’bozi’})

Merge (n)-[r:fuqi]->(f) delete r

Merge (n)-[r:FUQI]->(f)

Return n, f

④更新Set

Cypher無Update,用set代替

//更新屬性

Match (n:Person{id:’baba’}) set n.name=’張三’, n.age=60  return n

⑤delete和remove

刪以前最好先return 懼怕一不當心刪錯了

Delete操做用於刪除節點和關聯關係

Remove 操做用於刪除標籤和屬性

這兩個命令都應該與MATCH命令一塊兒使用

Match (n:Person{id:’baba’}) remove n.age return n

Match p=()-[r:teach]->() delete p //把全部teach的關係都刪除

Match (a:Person), (b:Person) where a.id=’erzi’ and b.id=’bozi’

Merge (a)-[r:FUQI]->b

Delete r

Match (s:Teacher)-[r:teach] ->(d:Student) delete r,s,d //把關係和節點都刪掉

Match (n:Test) remove n:Test//刪除label

Match (n{name:’Andre’}) DETACH DELTET n

⑥order by

Match (n:Person) Return n order by n.id,n.name desc skip 2 LIMIT 25

⑦Union和Union all

Union:把多段Match的return結果拼成一個結果集。會自動去重

Union all:做用同Union

Match (n:Person) where n.age >30 Return n.id, n.age order by n.id,n.age union all Match (n:Person) where n.id=’erzi’ and n.age is not null return n.id, n.age

Where 屬性 is null

            is not null

⑧in

Match (n:Person) where n.id in [‘erzi’,’bozi’,’baba’] and n.age is not null return n.id, n.age

⑨內置id

每一個relation都有個系統分配的id,從0開始遞增,全局惟一。通常不會用內置的。經過函數id(node/relation)能夠獲取id

用戶能夠自定義id屬性,與內置id無關。

Relation具備方向性,create節點之間關係時,必須指定方向,不然會報錯,可是查詢時,能夠不指定,不指定他就會把雙向的方向查出來。

Match(n:Person)-[:FUQI]-(s:Person) Return distinct n,s

⑩索引index

Create index on: Person(id);

Drop index on: Person(id);

不須要給索引發名稱,只須要設置索引字段便可

給哪些字段建索引呢?根據查詢須要,把查詢多的字段建索引。

⑾屬性惟一性約束

Create constrain on (a:Person) ASSERT a.id IS UNIQUE

Drop constrain on (a:Person) ASSERT a.id IS UNIQUE

⑿where

找到charlie和martin的最短路徑,而且關係裏面不存在father類型的關係。

MATCH (charlie:Person { name: 'Charlie Sheen' }),(martin:Person { name: 'Martin Sheen' }),

p =shortestPath((charlie)-[*]-(martin))

WHERE NONE (r IN relationships(p) WHERE type(r)= 'FATHER')

RETURN p

⑿經常使用函數shortestPath、allShortestPaths

Upper\lower\substring\replace

count\max\min\sum\avg 返回由Match命令返回的全部行的平均值等。。

neo4j無group by

Match (n:Person) return avg(n.age) ///只包含age不爲空的節點

Match (n:Person) return Substring(n.id,1,3), n.id

Match p=shortestPath((n:Person{id=’mama’})-[*..3]-(b:Person{id=’nainai})) return p

Match p=allshortestPaths((n:Person{id=’mama’})-[*..3]-(b:Person{id=’nainai})) return p

關係鏈路越短,表明這兩個節點的關係越密切。

⒀with

Match (user)-[:friend]-(friend)

Where user.name=$name

With user, count(friend) As friends

Where friends>10

Return user

4. 本地csv文件導入

把你的數據放在import文件夾。

LOAD CSV WITH HEADERS FROM "file:///高管節點.csv" AS row

CREATE (:高管{ggname:row.ggname,gs:row.gs,url:row.url,phone:row.phone,email:row.email,address:row.address})

LOAD CSV WITH HEADERS FROM "file:///資金.csv" AS row merge (n1:企業{名字:row.source}) with * merge (n2:企業{名字:row.target}) with * create (n1)-[i:借款]->(n2) set r.shaftWidth=row.weight

#海量數據加載

create constraint on (p:F_CERT) assert p.CASE_ID is unique; call apoc.periodic.iterate( "call apoc.load.jdbc('jdbc:oracle:thin:{username}/{password}@{hostip}:{port}:{servicename or sid}',\"select case_id,proportion from invest where start_type='2' and end_type='2'\")",

"merge (n1:F_CERT{CASE_ID:row.START_ID}) with * merge (n2:F_CERT{CASE_ID:row.END_ID}) with * create (n1)-[i:INVEST]->(n2) set i+=row",

{batchSize:100,iterateList:true})

注意事項:

一、節點裏「主鍵」應建索引,惟一「主鍵」應建「約束」;二、merge時()中只出現「主鍵」,其他屬性用set字句設定。

4. 踩過的坑

①報錯:CSV import : Cannot merge node using null property value

數據裏面出現了空值,去掉空值便可

②原本想批量導入關係,發現不行,必須分不一樣的關係分別導入

相關文章
相關標籤/搜索