圖數據庫在社交網絡、實時推薦、徵信系統、人工智能等領域有普遍應用。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
數據裏面出現了空值,去掉空值便可
②原本想批量導入關係,發現不行,必須分不一樣的關係分別導入