在本章中,我們將討論如何開發(fā)一個(gè) Spring 框架項(xiàng)目來使用 Neo4j 數(shù)據(jù)庫。
我們將使用以下? Spring Framework
?注釋來開發(fā)此應(yīng)用程序。
S.No. | Spring DATA Neo4j注解 | 用法 |
---|---|---|
1 | @GraphEntity | 定義域類?Neo4j Entity ? |
2 | @GraphID | 定義節(jié)點(diǎn)或關(guān)系?id ? |
3 | @GraphProperty | 定義節(jié)點(diǎn)或關(guān)系屬性 |
在開發(fā)應(yīng)用程序之前,請參考“Neo4j Spring DATA環(huán)境設(shè)置”一章來設(shè)置 Maven Eclipse IDE 項(xiàng)目。
實(shí)現(xiàn) Spring DATA Neo4j 應(yīng)用程序的簡要步驟 -
開發(fā)圖表實(shí)體或域或 ?POJO
? 類
開發(fā) ?DAO
? 或存儲(chǔ)庫
開發(fā)服務(wù)層(如果需要)
?Spring DATA Neo4j XML
? 配置
我們現(xiàn)在演示如何在 Eclipse IDE 中開發(fā)基于 Maven 的 Spring DATA 應(yīng)用程序來執(zhí)行? Neo4j DB
? 操作。
我們要實(shí)現(xiàn)?equals()
?和?hashCode()
?方法。
它不需要為?“id”
?屬性提供 ?setter
?方法,因?yàn)?Neo4j 將負(fù)責(zé)分配此屬性
package com.tp.springdata.neo4j.domain; import org.springframework.data.neo4j.annotation.GraphId; import org.springframework.data.neo4j.annotation.NodeEntity; @NodeEntity public class GoogleProfile { @GraphId Long id; private String name; private String address; private String sex; private String dob; public Long getId() { return id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getDob() { return dob; } public void setDob(String dob) { this.dob = dob; } public boolean equals(Object other) { if (this == other) return true; if (id == null) return false; if (! (other instanceof GoogleProfile)) return false; return id.equals(((GoogleProfile) other).id); } public int hashCode() { return id == null ? System.identityHashCode(this) : id.hashCode(); } public String toString(){ return "Profile[id:"+ id +",name:"+ name +",sex:" + sex+ ",address:" + address + ",dob:" + dob +"]"; } }
@GraphProperty 是可選的,所以我們可以省略這個(gè)。 上面的實(shí)體同下。
package com.tp.springdata.neo4j.domain; import org.springframework.data.neo4j.annotation.GraphId; import org.springframework.data.neo4j.annotation.NodeEntity; @NodeEntity public class GoogleProfile { @GraphId private Long id; private String name; private String address; private String sex; private String dob; // Getter for id // Setters and Getters for rest of properties // implement equals() and hashCode() methods }
開發(fā) Spring DATA Neo4j 存儲(chǔ)庫。
正如我們前面討論的,我們需要通過擴(kuò)展? Spring DATA Neo4j API
? 接口?“GraphRepository”
?而不需要它的實(shí)現(xiàn)來開發(fā)接口。
Spring DATA Neo4j 將在內(nèi)部為此接口提供實(shí)現(xiàn)。
為我們的 ?Domain
? 類定義一個(gè)存儲(chǔ)庫或 DAO 接口:?GoogleProfile
?
package com.tp.springdata.neo4j.dao; import org.springframework.data.neo4j.repository.GraphRepository; public interface GoogleProfileRepository extends GraphRepository<GoogleProfile>{ }
實(shí)現(xiàn) Spring DAT Neo4j 存儲(chǔ)庫非常容易和簡單。 我們只需要通過指定我們的域類作為參數(shù)來擴(kuò)展 GraphRepository 來定義一個(gè)接口。
發(fā)展服務(wù)層工件:接口和實(shí)現(xiàn)。
最好在我們的應(yīng)用程序中在 DAO 層之上提供一個(gè) ?Service
? 層。
?Service
?組件接口:
package com.tp.springdata.neo4j.service; import org.springframework.data.neo4j.conversion.Result; import com.tp.springdata.neo4j.domain.GoogleProfile; public interface GoogleProfileService { GoogleProfile create(GoogleProfile profile); void delete(GoogleProfile profile); GoogleProfile findById(long id); Result<GoogleProfile> findAll(); }
?Service
?組件的實(shí)現(xiàn):
package com.tp.springdata.neo4j.service; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.neo4j.conversion.Result; import org.springframework.stereotype.Service; import com.tp.springdata.neo4j.dao.GoogleProfileRepository; import com.tp.springdata.neo4j.domain.GoogleProfile; @Service("googleProfileService") public class GoogleProfileServiceImpl implements GoogleProfileService { @Autowired private GoogleProfileRepository googleProfileRepository; public GoogleProfile create(GoogleProfile profile) { return googleProfileRepository.save(profile); } public void delete(GoogleProfile profile) { googleProfileRepository.delete(profile); } public GoogleProfile findById(long id) { return googleProfileRepository.findOne(id); } public Result<GoogleProfile> findAll() { return googleProfileRepository.findAll(); } }
要運(yùn)行基于 Spring 的應(yīng)用程序,我們需要提供一些 XML 配置。
我們需要在 Spring XML 配置文件中提供以下詳細(xì)信息
提供 Spring Data Neo4j 命名空間
xmlns:neo4j=http://www.springframework.org/schema/data/neo4j
提供 Spring 數(shù)據(jù) Neo4j 模式定義(XSD 文件)
xsi:schemaLocation="http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd"
spring-neo4j.xsd 文件包含所有 Spring Data Neo4j 相關(guān)的? XML
? 標(biāo)簽
提供我們的 Neo4j 數(shù)據(jù)庫位置和我們的圖實(shí)體(域或 POJO 類)基礎(chǔ)包
<neo4j:config storeDirectory="C:TPNeo4jDB" base-package="com.tp.springdata.neo4j.domain"/?>
這里 storeDirectory =“C:\ TPNeo4jDB”指定我們的 Neo4j 數(shù)據(jù)庫文件存儲(chǔ)在我們的文件系統(tǒng)中的 C:\ TPNeo4jDB 位置。
base-package =“com.tp.springdata.neo4j.domain”
我們的所有圖實(shí)體都有 ?com.tp.springdata.neo4j.domain
? 作為我們的應(yīng)用程序類路徑中的基礎(chǔ)包
提供我們的 Spring Data Neo4j 存儲(chǔ)庫(DAO Interfaces)基礎(chǔ)包。
<neo4j:repositories base-package="com.tp.springdata.neo4j.dao"/?>
我們的所有 Spring Data Neo4j 存儲(chǔ)庫都可以在我們的應(yīng)用程序類路徑 ?com.tp.springdata.neo4j.dao
? 包
提供 Spring 配置以注冊帶有 Spring IOC 容器的注釋組件。
<context:component-scan base-package="com.tp.springdata.neo4j.service" /?>
我們的所有組件或服務(wù)都可以在我們的應(yīng)用程序類路徑中的?“com.tp.springdata.neo4j.service
?”包
完成?“googleprofile.xml”
?
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:neo4j="http://www.springframework.org/schema/data/neo4j" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/data/neo4j http://www.springframework.org/schema/data/neo4j/spring-neo4j.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> <context:component-scan base-package="com.tp.springdata.neo4j.service" /> <neo4j:config storeDirectory="C:TPNeo4jDB" base-package="com.tp.springdata.neo4j.domain"/> <neo4j:repositories base-package="com.tp.springdata.neo4j.dao"/> <tx:annotation-driven /> </beans>
開發(fā)測試程序并測試所有操作
import java.util.Iterator; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.data.neo4j.conversion.Result; import com.tp.springdata.neo4j.service.GoogleProfileService; import com.tp.springdata.neo4j.domain.GoogleProfile; public class GoogleProfileTest { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("googleprofile.xml"); GoogleProfileService service = (GoogleProfileService) context.getBean("googleProfileService"); // Please uncomment one of the operation section // and comment remaining section to test only one operation at a time // Here I've uncommented CREATE operation and // commented other operations: FIND ONE, FIND ALL, DELETE // CREATE Operation GoogleProfile profile = createPofile(); createProfile(service,profile); System.out.println("GoogleProfile created successfully."); // FIND ONE /* GoogleProfile profile = getOneProfileById(service,67515L); System.out.println(profile); */ // FIND ALL /* getAllProfiles(service); */ // DELETE /* GoogleProfile profile = createPofile(); deleteProfile(service,profile); System.out.println("GoogleProfile deleted successfully."); */ } private static GoogleProfile createProfile(GoogleProfileService service, GoogleProfile profile){ return service.create(profile); } private static void deleteProfile(GoogleProfileService service,GoogleProfile profile){ service.delete(profile); } private static GoogleProfile getOneProfileById(GoogleProfileService service,Long id){ return service.findById(id); } private static void getAllProfiles(GoogleProfileService service){ Result<GoogleProfile> result = service.findAll(); Iterator<GoogleProfile> iterator = result.iterator(); while(iterator.hasNext()){ System.out.println(iterator.next()); } } private static GoogleProfile createPofile(){ GoogleProfile profile = new GoogleProfile(); profile.setName("Profile-2"); profile.setAddress("Hyderabad"); profile.setSex("Male"); profile.setDob("02/02/1980"); return profile; } }
我已取消注釋只有為 CREATE 操作和注釋剩下的3個(gè)操作。
如果你想測試其他操作,?jut
? 注釋不需要的部分和取消注釋想要的部分,并測試此應(yīng)用程序
最終 Eclipse Maven 項(xiàng)目結(jié)構(gòu)
當(dāng)我們運(yùn)行這個(gè)程序,請確保我們的 Neo4j 數(shù)據(jù)庫服務(wù)器應(yīng)該在? SHUTDOWM
?狀態(tài)。
在執(zhí)行此 Java 程序之前,檢查您的 Neo4j 是否處于關(guān)閉模式。 如果沒有,請點(diǎn)擊“停止”按鈕展開它。
運(yùn)行 GoogleProfileTest.java 應(yīng)用程序并查看結(jié)果
當(dāng)我們在 Eclipse IDE 中運(yùn)行這個(gè) CREATE 操作時(shí),我們可以在控制臺(tái)中觀察到以下消息。
執(zhí)行一些操作后,然后通過單擊“開始”按鈕啟動(dòng) Neo4j 數(shù)據(jù)庫服務(wù)器
使用 http:// localhost:7474 / url 打開 Neo4j 數(shù)據(jù)瀏覽器
在數(shù)據(jù)瀏覽器上鍵入以下命令
點(diǎn)擊“執(zhí)行”按鈕并觀察結(jié)果
到目前為止,我們已經(jīng)創(chuàng)建了3個(gè)? GoogleProfile
?節(jié)點(diǎn)。
更多建議: