NOSQL图形数据库 - Neo4j
Neo4j入門指南
- 1、簡介
- 2、特點
- 3、安裝
- 4、基礎(chǔ)操作
- 5、Java集成
- 5.1 內(nèi)嵌數(shù)據(jù)庫集成方式
- 5.2 服務器集成方式
- 5.3 Spring集成方式
- 參考文檔
1、簡介
Neo4j是一個高性能的,NOSQL圖形數(shù)據(jù)庫,它將結(jié)構(gòu)化數(shù)據(jù)存儲在網(wǎng)絡上而不是表中。它是一個嵌入式的、基于磁盤的、具備完全的事務特性的Java持久化引擎,但是它將結(jié)構(gòu)化數(shù)據(jù)存儲在網(wǎng)絡(從數(shù)學角度叫做圖)上而不是表中。Neo4j也可以被看作是一個高性能的圖引擎,該引擎具有成熟數(shù)據(jù)庫的所有特性。程序員工作在一個面向?qū)ο蟮摹㈧`活的網(wǎng)絡結(jié)構(gòu)下而不是嚴格、靜態(tài)的表中——但是他們可以享受到具備完全的事務特性、企業(yè)級的數(shù)據(jù)庫的所有好處。
2、特點
- 對象關(guān)系的不匹配使得把面向?qū)ο蟮摹皥A的對象”擠到面向關(guān)系的“方的表”中是那么的困難和費勁,而這一切是可以避免的。
- 關(guān)系模型靜態(tài)、剛性、不靈活的本質(zhì)使得改變schemas以滿足不斷變化的業(yè)務需求是非常困難的。由于同樣的原因,當開發(fā)小組想應用敏捷軟件開發(fā)時,數(shù)據(jù)庫經(jīng)常拖后腿。
- 關(guān)系模型很不適合表達半結(jié)構(gòu)化的數(shù)據(jù)——而業(yè)界的分析家和研究者都認為半結(jié)構(gòu)化數(shù)據(jù)是信息管理中的下一個重頭戲。
- 網(wǎng)絡是一種非常高效的數(shù)據(jù)存儲結(jié)構(gòu)。人腦是一個巨大的網(wǎng)絡,萬維網(wǎng)也同樣構(gòu)造成網(wǎng)狀,這些都不是巧合。關(guān)系模型可以表達面向網(wǎng)絡的數(shù)據(jù),但是在遍歷網(wǎng)絡并抽取信息的能力上關(guān)系模型是非常弱的。
3、安裝
從Docker Hub上pull一個Neo4j的鏡像
docker pull neo4j
啟動一個Neo4j的容器, 在Home目錄下建立一個/neo4j/data文件夾用于存放數(shù)據(jù)
docker run -d --name neo4j
--publish=7474:7474
--publish=7687:7687
--volume=$HOME/neo4j/data:/data
neo4j
在瀏覽器中訪問 http://ipaddress:7474 可以看到如下的UI界面,輸入默認用戶名和密碼neo4j即可連接到neo4j數(shù)據(jù)庫。
4、基礎(chǔ)操作
Neo4j使用Cypher語法操作數(shù)據(jù)庫,CRUD示例
創(chuàng)建節(jié)點
CREATE (e:Country{name:"中國"})
CREATE (e1:Country{name:"美國"})
CREATE (c:Company{name:"騰訊",createtime:"2000-12-20"})
CREATE (c1:Company{name:"蘋果",createtime:"2002-07-08"})
CREATE (c2:Company{name:"阿里",createtime:"2004-12-20"})
CREATE (c3:Company{name:"美團",createtime:"2010-12-20"})
CREATE (c4:Company{name:"亞馬遜",createtime:"2007-07-08"})
創(chuàng)建關(guān)系
MATCH (e:Country) WHERE e.name="中國" MATCH (c:Company) WHERE c.name="騰訊" CREATE (c)-[r:BELONG_TO]->(e) RETURN e,c,r
MATCH (e:Country) WHERE e.name="中國" MATCH (c:Company) WHERE c.name="美團" CREATE (c)-[r:BELONG_TO]->(e) RETURN e,c,r
MATCH (e:Country) WHERE e.name="中國" MATCH (c:Company) WHERE c.name="阿里" CREATE (c)-[r:BELONG_TO]->(e) RETURN e,c,r
MATCH (e:Country) WHERE e.name="美國" MATCH (c:Company) WHERE c.name="亞馬遜" CREATE (c)-[r:BELONG_TO]->(e) RETURN e,c,r
MATCH (e:Country) WHERE e.name="美國" MATCH (c:Company) WHERE c.name="蘋果" CREATE (c)-[r:BELONG_TO]->(e) RETURN e,c,r
MATCH (e:Country{name:"中國"}) MATCH (e1:Country{name:"美國"}) CREATE (e)-[r:PARTNER{desc:"成為合作伙伴",time:"2000-02-08"}]->(e1) RETURN e,e1,r
MATCH (e:Country{name:"中國"}) MATCH (e1:Country{name:"美國"}) CREATE (e1)-[r:PARTNER{desc:"成為合作伙伴",time:"2000-02-08"}]->(e) RETURN e,e1,r
查詢節(jié)點、關(guān)系
# 查詢 Company 類型的節(jié)點
MATCH (e:Company) RETURN e
MATCH (e:Company) RETURN e.name,e.createtime LIMIT 25
# 查詢所有的節(jié)點
MATCH (n) RETURN n LIMIT 25# 查詢 BELONG_TO 類型的關(guān)系
MATCH p=()-[r:BELONG_TO]->() RETURN p LIMIT 25
MATCH (e:Company{name:"美團"})-[r]-(e1:Country{name:"中國"}) RETURN e,r,e1
# 查詢所有的關(guān)系
MATCH p=()-->() RETURN p LIMIT 25
刪除節(jié)點、關(guān)系
# 刪除節(jié)點(刪除節(jié)點前,需保證該節(jié)點不存在關(guān)系)
MATCH (e:Company) WHERE e.name="美團" DELETE e
# 僅僅刪除`美團`與`中國`之間的關(guān)系
MATCH (e:Company{name:"美團"})-[r]-(e1:Country{name:"中國"}) DELETE r
# 刪除`美團`與`中國`節(jié)點以及他們之間的關(guān)系
MATCH (e:Company{name:"美團"})-[r]-(e1:Country{name:"中國"}) DELETE e,r,e1
# 刪除關(guān)系為BELONG_TO的節(jié)點以及他們的關(guān)系
MATCH p=()-[r:BELONG_TO]->() DELETE p
# 刪除所有存在關(guān)系的節(jié)點以及他們之間的關(guān)系
MATCH p=()-->() DELETE p
修改節(jié)點、關(guān)系屬性
MATCH (e:Company) WHERE e.name="美團" SET e.name="美團點評" RETURN e
MATCH (e:Company{name:"美團點評"})-[r]->(c:Country) SET r.name="屬于" RETURN e,r,c
5、Java集成
5.1 內(nèi)嵌數(shù)據(jù)庫集成方式
所需依賴
compile('org.neo4j:neo4j:3.4.3')
示例代碼
public static void main(String[] args) throws Exception {GraphDatabaseFactory dbFactory = new GraphDatabaseFactory();GraphDatabaseService db = dbFactory.newEmbeddedDatabase(new File("E:/TPNeo4jDB"));try (Transaction tx = db.beginTx()) {Node javaNode = db.createNode(Tutorials.JAVA);javaNode.setProperty("TutorialID", "JAVA001");javaNode.setProperty("Title", "Learn Java");javaNode.setProperty("NoOfChapters", "25");javaNode.setProperty("Status", "Completed");Node scalaNode = db.createNode(Tutorials.SCALA);scalaNode.setProperty("TutorialID", "SCALA001");scalaNode.setProperty("Title", "Learn Scala");scalaNode.setProperty("NoOfChapters", "20");scalaNode.setProperty("Status", "Completed");Relationship relationship = javaNode.createRelationshipTo(scalaNode, TutorialRelationships.JVM_LANGIAGES);relationship.setProperty("Id", "1234");relationship.setProperty("OOPS", "YES");relationship.setProperty("FP", "YES");tx.success();}System.out.println("Done successfully");}public enum Tutorials implements Label {JAVA, SCALA, SQL, NEO4J,;
}public enum TutorialRelationships implements RelationshipType {JVM_LANGIAGES, NON_JVM_LANGIAGES;
}
5.2 服務器集成方式
所需依賴
compile('org.neo4j.driver:neo4j-java-driver:1.6.1')
示例代碼
public static void main(String[] args) throws Exception {Driver driver = GraphDatabase.driver("bolt://192.168.15.145:7687", AuthTokens.basic("neo4j", "123456"));Session session = driver.session();Map<String, Object> saveMap = new HashMap<>(2);saveMap.put("name", "Arthur001");saveMap.put("title", "King001");session.run("CREATE (a:Person {name: {name}, title: {title}})", saveMap);Map<String, Object> queryMap = new HashMap<>(1);queryMap.put("name", "Arthur001");StatementResult result = session.run("MATCH (a:Person) WHERE a.name = {name} " +"RETURN a.name AS name, a.title AS title", queryMap);while (result.hasNext()) {Record record = result.next();System.out.println(record.get("title").asString() + " " + record.get("name").asString());}session.close();driver.close();}
5.3 Spring集成方式
所需依賴
compile ('org.springframework.data:spring-data-neo4j:5.0.8.RELEASE')
示例代碼
Domain Entities
@NodeEntity
public class Movie {@Id @GeneratedValue Long id;String title;Person director;@Relationship(type="ACTS_IN", direction = Relationship.INCOMING)Set<Person> actors;@Relationship(type = "RATED")List<Rating> ratings;
}
Repositories
interface MovieRepository extends Neo4jRepository<Movie, Long> {// derived finderMovie findByTitle(String title);@Query("MATCH (m:Movie)<-[rating:RATED]-(user) WHERE id(movie)={movie} return rating")List<Rating> getRatings(@Param("movie") Movie movie);// Co-ActorsSet<Person> findByActorsMoviesActorName(String name);@Query("MATCH (movie:Movie)-[:HAS_GENRE]->(genre)<-[:HAS_GENRE]-(similar)WHERE id(movie) = {0} RETURN similar")List<Movie> findSimilarMovies(Movie movie);
}
Configuration
@Configuration
@EnableTransactionManagement
@ComponentScan("org.neo4j.cineasts")
@EnableNeo4jRepositories("org.neo4j.cineasts.repository")
public class PersistenceContext {@Beanpublic SessionFactory getSessionFactory() {return new SessionFactory(configuration(), "org.neo4j.cineasts.domain");}@Beanpublic Neo4jTransactionManager transactionManager() throws Exception {return new Neo4jTransactionManager(getSessionFactory());}@Beanpublic org.neo4j.ogm.config.Configuration configuration() {return new org.neo4j.ogm.config.Configuration.Builder().uri("bolt://localhost").build();}
}
Example
@Autowired MovieRepository repo;Iterable<Movie> movies = repo.findAll();
Movie movie = repo.findByTitle("The Matrix");
repo.save(movie);List<Rating> ratings = repo.getRatings(movie);
參考文檔
- Neo4j官方連接:https://neo4j.com/
- w3c教程:https://www.w3cschool.cn/neo4j/
- Spring-Data-Neo4j: https://projects.spring.io/spring-data-neo4j/
總結(jié)
以上是生活随笔為你收集整理的NOSQL图形数据库 - Neo4j的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ZooKeeper简单使用
- 下一篇: 聊一聊Spring中的线程安全性