Neo4j图数据库学习笔记
Neo4j圖數據庫
數據庫安裝
?
下載安裝包 https://neo4j.com/artifact.php?name=neo4j-community-4.1.1-windows.zip
解壓
bin:數據庫啟動等文件
neo4j.bat 服務端啟動文件
cypher-shell.bat 不適用瀏覽器,使用shell輸命令執行CQL語言
neo4j-admin.bat neo4j管理員工具,數據庫備份導出這些的
conf: 數據庫配置文件
data: 數據庫持久化默認文件夾,可以在配置文件修改默認目錄
logs: 數據庫日志文件
cmd進入bin目錄,輸入neo4j.bat console
可以看出,可以在本機的7474端口可以訪問
瀏覽器輸入 http://localhost:7474/
這里用戶名和密碼默認都是neo4j,進去就會修改默認密碼,修改成功就可
進入neo4j控制臺
?
數據庫案例初識
圖的基本理念
?
一個圖數據庫使用以下理念能存儲任何數據
節點 - 圖的數據記錄
關系 - 連接節點
屬性 - 標識數據值
圖數據庫節點和屬性
?
節點就是記錄在圖中的數據
數據以Properties的方式儲存
Properties就是簡單的鍵值對
圖數據庫的標簽
?
標簽是用來關聯一組節點的,也就說說節點使用標簽分類,標簽就是類,而節點就是這個類的實例
一個節點可以有>=0個標簽
標簽不能有屬性
約束自由
?
節點可以有不同的屬性
同一類節點可以有不同的標簽,這里的類表示擁有相同的標簽
屬性可以是字符串、數字、布爾型
Neo4j可以儲存數十億個節點
圖的關系
?
連接圖中節點的
關系有方向性
關系有類型
關系不是任意定義的,它也有數據模型
關系屬性
?
關系屬性用來儲存兩個節點之間的共享信息
?
數據庫查詢語言CQL
?
Cypher : Neo4j的圖查詢語言
概述
?
使用模式描述圖形數據
熟悉的類似SQL的查詢語句
說明性的,描述要查找的內容,而不是如何查找
Cypher
創建節點CREATE
?
使用create創建一個節點
CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 })解釋:創建一個標簽為Person的節點ee,他的屬性有name是Emil、from是Sweden和klout是99
查詢節點MATCH
?
使用match語句查找節點
MATCH (ee:Person)?WHERE?ee.name = "Emil" RETURN ee;解釋: 查找標簽為Person,節點的name屬性為Emil的,節點定義為ee,然后把這個節點ee返回,這里的ee不一定是數據庫創建時的那個名字
創建多個節點和多個關系
?
MATCH (ee:Person)?WHERE?ee.name = "Emil" CREATE?(js:Person { name: "Johan",?from: "Sweden", learn: "surfing" }), (ir:Person { name: "Ian",?from: "England", title: "author" }), (rvb:Person { name: "Rik",?from: "Belgium", pet: "Orval" }), (ally:Person { name: "Allison",?from: "California", hobby: "surfing" }), (ee)-[:KNOWS {since:?2001}]->(js),(ee)-[:KNOWS {rating:?5}]->(ir), (js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb), (ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally), (rvb)-[:KNOWS]->(ally)解釋:
MATCH (ee:Person) WHERE ee.name = "Emil" 將第一次創建的那個節點引入,因為要和其他節點建立關系
(ee)-[:KNOWS {since: 2001}]->(js) 給ee節點和js節點建立一個關系,從ee指向js的,關系上共享數據是since 2001,也就是說ee自從2001年了解到js的
查看勞動成果
?
MATCH (abc:Person) RETURN abc?
關系查詢
?
MATCH (ee:Person)-[:KNOWS]-(friends) WHERE?ee.name = "Emil" RETURN ee, friends解釋: 查詢name屬性為Emil的Person,和他有KNOWS關系的人,然后返回這個人和所有符合的朋友
執行結果:
注意:如果不返回ee的話,只返回他的朋友
MATCH (ee:Person)-[:KNOWS]-(friends) WHERE?ee.name = "Emil" RETURN friends?
思考:
MATCH (ee:Person)-[:KNOWS]-(friends) RETURN friends MATCH (ee:Person) RETURN ee這兩句的返回結果一樣?
推薦節點
?
MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer) WHERE?js.name = "Johan"?AND?surfer.hobby = "surfing" RETURN?DISTINCT?surfer解釋: 找到和Johan有相同愛好surfing的人
執行的任務可視化
?
使用關鍵字:EXPLAIN 和 PROFILE
-
EXPLAIN:是解釋機制,加入該關鍵字的Cypher語句可以預覽執行的過程但并不實際執行,所以也不會產生任何結果。
-
PROFILE:則是畫像機制,查詢中使用該關鍵字,不僅能夠看到執行計劃的詳細內容,也可以看到查詢的執行結果。
例子
PROFILE MATCH (js:Person)-[:KNOWS]-()-[:KNOWS]-(surfer) WHERE?js.name = "Johan"?AND?surfer.hobby = "surfing" RETURN?DISTINCT?surfer注意:可以根據執行分析對CQL進行
?
電影案例
?
返回姓名為Tom Hanks的演員
match (aa:Person) where aa.name="Tom Hanks" return aa; match (aa {name:"Tom Hanks"}) return aa;查找演員名字最多10個(使用limit關鍵字)
match (p:Person) return p.name?limit?10查找電影在20世紀90年代發布的電影
match (m:Movie)?where?m.released >=?1900?and?m.released <?2000?return m.title;查找Tom Hanks參與過的電影
match (p:Person)-[:ACTED_IN]->(m:Movie)?where?p.name="Tom Hanks" return p,m; MATCH (tom:Person {name: "Tom Hanks"})-[:ACTED_IN]->(tomHanksMovies) RETURN tom,tomHanksMovies誰參與表演了電影Cloud Atlas
match (m:Movie)<-[:DIRECTED]-(p:Person)?where?m.title="Cloud Atlas" return p.name; MATCH (cloudAtlas {title: "Cloud Atlas"})<-[:DIRECTED]-(directors) RETURN directors.name查找和Tom Hanks一起演出的人
match (p:Person) -[:ACTED_IN]->(m:Movie)<-[:ACTED_IN]-(co:Person)?where?p.name="Tom Hanks" return co.name; MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors) RETURN coActors.name和電影Cloud Atlas有關系的人和關系類型
match (p:Person) -[rel]-(m:Movie)?where?m.title="Cloud Atlas" return p.name,Type(rel),rel; MATCH (people:Person)-[relatedTo]-(:Movie {title: "Cloud Atlas"}) RETURN people.name,?Type(relatedTo), relatedTo能通過最大4個節點找到的節點
MATCH (bacon:Person {name:"Kevin Bacon"})-[*1..4]-(hollywood) RETURN?DISTINCT?hollywood這里[*1..4] 表示1到4 ,[*3] 表示3
查找Kevin Bacon和Meg Ryan能關聯到的關系的最短路徑
MATCH p=shortestPath( (bacon:Person {name:"Kevin Bacon"})-[*]-(meg:Person {name:"Meg Ryan"}) ) RETURN p這里*表示任何關系
查找沒和Tom Hanks一起演出的人,但是他們之間有聯系
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors) WHERE?NOT?(tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors)?AND?tom <> cocoActors RETURN cocoActors.name?AS?Recommended,?count(*)?AS?Strength?ORDER?BY?Strength?DESC分析:
(tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors)這句話coActors表示和Tom Hanks一起表演過的人
(coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cocoActors) 這句話cocoActors表示和coActors一起表演過的人,這里意味著找到了朋友的朋友
NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(cocoActors) 這句話排除了既是朋友的朋友,又是朋友的人
tom <> cocoActors 這句話保證了所得的朋友的朋友不是自己
count(*) AS Strength這里統計了Tom Hanks到朋友的朋友能到達的路徑條數,可以用這個表達推薦的優先級
ORDER BY Strength DESC按照Strength 降序排序
查找既參演過Tom Hanks演過的電影,又參演了Tom Cruise演過的電影的
MATCH (tom:Person {name:"Tom Hanks"})-[:ACTED_IN]->(m)<-[:ACTED_IN]-(coActors), (coActors)-[:ACTED_IN]->(m2)<-[:ACTED_IN]-(cruise:Person {name:"Tom Cruise"}) RETURN tom, m, coActors, m2, cruise一張圖看懂這句話
?
技巧
?
查看圖中所有節點和關系
MATCH (n) RETURN n刪除所有節點
MATCH (n) DETACH?DELETE?n判斷屬性是否存在
is null?
SpringBoot整合Neo4j
構建圖
?
依賴導入
?
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-neo4j</artifactId> </dependency>配置文件
?
spring.data.neo4j.uri=bolt://localhost spring.data.neo4j.username=neo4j spring.data.neo4j.password=860820編寫實體類
?
import lombok.Data; import org.neo4j.ogm.annotation.Id; import org.neo4j.ogm.annotation.NodeEntity;@NodeEntity(label = "USER") @Data public class User {@Idprivate Long id;private Integer userId;private String userName;private Integer age;private String password; } @RelationshipEntity(type = "FRIEND_WITH") @Data public class FriendRelation {@Idprivate Long id;@StartNodeprivate User startNode;@EndNodeprivate User endNode;private Date since; }?
編寫DAO層接口
import com.example.neo4jdemo.pojo.User; import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository;import java.util.List;@Repository public interface UserDao extends Neo4jRepository<User,Long> {/*** 查詢所有用戶* @return*/@Query("MATCH (user:USER) RETURN user")List<User> getUserList();/*** 按照姓名查詢* @param name* @return*/@Query("MATCH (user:USER) WHERE user.userName=$userName RETURN user")List<User> getUserByName(@Param("userName") String name);} import com.example.neo4jdemo.pojo.FriendRelation; import com.example.neo4jdemo.pojo.User; import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository;import java.util.List;@Repository public interface FriendRelationDao extends Neo4jRepository<FriendRelation,Long> {/*** 查找指定姓名的朋友* @param name* @return*/@Query("MATCH (u:USER)-[:FRIEND_WITH]->(rl) WHERE u.userName=$name RETURN rl")List<User> getFriend(@Param("name") String name);/*** 按照姓名查找朋友的朋友* @param name* @return*/@Query("MATCH (u:USER{userName:$name})-[:FRIEND_WITH]->(rl:USER),(rl)-[:FRIEND_WITH]->(newf:USER) WHERE NOT (u)-[:FRIEND_WITH]->(newf) AND u<> newf RETURN newf")List<User> getMayBeFriend(@Param("name") String name); } import com.example.neo4jdemo.pojo.FriendRelation; import com.example.neo4jdemo.pojo.User; import org.springframework.data.neo4j.annotation.Query; import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.data.repository.query.Param; import org.springframework.stereotype.Repository;import java.util.List;@Repository public interface FriendRelationDao extends Neo4jRepository<FriendRelation,Long> {@Query("MATCH (u:USER)-[:FRIEND_WITH]->(rl) WHERE u.userName=$name RETURN rl")List<User> getFriend(@Param("name") String name);@Query("MATCH (u:USER{userName:$name})-[:FRIEND_WITH]->(rl:USER),(rl)-[:FRIEND_WITH]->(newf:USER) WHERE NOT (u)-[:FRIEND_WITH]->(newf) AND u<> newf RETURN newf")List<User> getMayBeFriend(@Param("name") String name); }編寫服務接口和實現類
?
(這里懶,沒有寫接口)
import com.example.neo4jdemo.dao.FriendRelationDao; import com.example.neo4jdemo.dao.UserDao; import com.example.neo4jdemo.pojo.User; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service;import java.util.List;@Service public class UserService {@Autowiredprivate UserDao userDao;@Autowiredprivate FriendRelationDao friendRelationDao;public List<User> findByName(String name){return userDao.getUserByName(name);}public List<User> findAll(){return userDao.getUserList();}public List<User> getFriend(String name){return friendRelationDao.getFriend(name);}public List<User> recommend(String name){return friendRelationDao.getMayBeFriend(name);} }編寫Controller
?
import com.example.neo4jdemo.pojo.User; import com.example.neo4jdemo.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.ResponseBody;import java.util.List;@Controller public class UserController {@Autowiredprivate UserService userService;@GetMapping("/get")@ResponseBodypublic List<User> get(){return userService.findAll();}@GetMapping("/get/{name}")@ResponseBodypublic List<User> get(@PathVariable String name){return userService.findByName(name);}@GetMapping("/friend/{name}")@ResponseBodypublic List<User> getFriend(@PathVariable String name){return userService.getFriend(name);}@GetMapping("/recommend/{name}")@ResponseBodypublic List<User> getMeyBeFriend(@PathVariable String name){return userService.recommend(name);} }?
瀏覽器查看結果
?
總結
以上是生活随笔為你收集整理的Neo4j图数据库学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机函数说课ppt,全国“XX杯”说课
- 下一篇: 人体检测报警装置c语言,一种人体感应报警