筆者以spring-data-neo4j-5.0.5爲例,側重使用純spring的方式使用neo4j實現圖庫的增刪改查。
spring-boot的方式網上資料很多,不是筆者今天的關注點,因爲大部分工作spring-boot都做好了,開發者要做的很少。
這裏簡單使用一個domain,和一個repository模擬一個節點插入的場景。
節點定義
AssetNodeNeo.java
@NodeEntity
@Getter
@Setter
@RequiredArgsConstructor
public class AssetNodeNeo {
@Id
@GeneratedValue
private Long id;
private Long assetId;
private String logicName;
private String physicsName;
private Long storageId;
private long modifyTime;
public AssetNodeNeo(Long assetId, String logicName, String physicsName, Long storageId, long modifyTime) {
this.assetId = assetId;
this.logicName = logicName;
this.physicsName = physicsName;
this.storageId = storageId;
this.modifyTime = modifyTime;
}
}
持久層定義
AssetNodeRepository.java
public interface AssetNodeRepository extends Neo4jRepository<AssetNodeNeo,Long>,CustomizedRepository {
}
這裏繼承Neo4jRepository,既spring-data-neo4j-4.x的GraphRepository,對增刪改查做好了封裝,相當於關係型的jdbcTemplate。
邏輯層定義
TestService.java
@Service
public class TestService {
@Autowired
private AssetNodeRepository assetNodeRepository;
public void createNode() {
AssetNodeNeo a1 = new AssetNodeNeo(257L, "a1", "a1", 6L,
System.currentTimeMillis());
assetNodeRepository.save(a1);
}
}
筆者模擬的邏輯很簡單,加載spring容器,然後使用TestService將a1節點插入圖庫中。
下面分別使用java config和xml兩種方式來實現:
java config方式運行
neo4j配置:
@Configuration
@ComponentScan(basePackages = {"com.yq.service"})
@EnableNeo4jRepositories(basePackages = "com.yq.repository")
public class Neo4jConfiguration {
@Bean
public org.neo4j.ogm.config.Configuration configuration() {
Neo4jProperties properties = new Neo4jProperties();
properties.setUri("bolt://localhost:7688");
properties.setUsername("neo4j");
properties.setPassword("123123");
org.neo4j.ogm.config.Configuration configuration = properties.createConfiguration();
return configuration;
}
@Bean
public SessionFactory sessionFactory(org.neo4j.ogm.config.Configuration configuration) {
return new SessionFactory(configuration, "com.yq.domain");
}
@Bean
public Neo4jTransactionManager transactionManager(SessionFactory sessionFactory) {
return new Neo4jTransactionManager(sessionFactory);
}
}
@Configuration 生命這是一個spring配置類
@ComponentScan(basePackages = {“com.yq.service”}) 掃描邏輯層的所有service
@EnableNeo4jRepositories(basePackages = “com.yq.repository”) 掃描neo4j的持久層
分別聲明瞭session工廠、事物管理器等3個bean,和官網類似
啓動類:
public class SpringApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Neo4jConfiguration.class);
TestService testService = context.getBean(TestService.class);
testService.createNode();
context.stop();
}
}
xml方式運行
xml配置:
spring.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:context="http://www.springframework.org/schema/context"
xmlns:neo4j="http://www.springframework.org/schema/data/neo4j"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.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">
<context:component-scan base-package="com.yq"/>
<bean id="sessionFactory" class="com.yq.conf.Neo4jSessionFactory" factory-method="getSessionFactory">
<constructor-arg name="uri" value="bolt://localhost:7688"/>
<constructor-arg name="username" value="neo4j"/>
<constructor-arg name="password" value="123123"/>
<constructor-arg name="domainPackage" value="com.yq.domain"/>
</bean>
<bean id="transactionManager" class="org.springframework.data.neo4j.transaction.Neo4jTransactionManager">
<constructor-arg ref="sessionFactory"/>
</bean>
<neo4j:repositories base-package="com.yq.repository"/>
</beans>
<context:component-scan base-package=“com.yq”/> 掃描業務層
<neo4j:repositories base-package=“com.yq.repository”/>掃描neo4j持久層
分別聲明瞭session工廠、事物管理器2個bean,和java config方式類似
由於org.neo4j.ogm.session.SessionFactory
構造方法入參比較複雜,這裏筆者封裝了Neo4jSessionFactory靜態工廠方法用於構造sessionFactory對象,具體如下:
Neo4jSessionFactory.java
@Setter
public class Neo4jSessionFactory {
/**
* Create instance of {@link SessionFactory}.
*
* @param uri URI used by the driver. Auto-detected by default.
* @param username Login user of the server.
* @param password Login password of the server.
* @param domainPackage The packages to scan for domain objects.
*/
public static SessionFactory getSessionFactory(String uri, String username, String password, String domainPackage) {
Neo4jProperties properties = new Neo4jProperties();
properties.setUri(uri);
properties.setUsername(username);
properties.setPassword(password);
org.neo4j.ogm.config.Configuration configuration = properties.createConfiguration();
return new SessionFactory(configuration, domainPackage);
}
}
啓動類:
public class SpringApplication {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
"classpath:spring.xml");
TestService testService = context.getBean(TestService.class);
testService.createNode();
context.stop();
}
}
上面兩種方式經測試皆可行,執行後,查看圖庫:
參考文檔:
spring-data-neo4j