一、neo4j数据库组织方式
neo4j是典型的图数据库,采用项目-图-节点以及关系的方式管理图数据;即:可 根据应用将对图的应用划分为多个项目,一个项目可以包含多张图,一张图可以包含多个节点,每个节点具有多个属性,节点间通过关系联系,每种关系均支持多属性设置,节点间关系具有方向,两个节点间可以具有多种关系;
二、编程访问neo4j的方式的
neo4j提供了多类型数据库访问接口,包含了:.net、java、java script 等多种编程语言的访问驱动,可参见网址:https://neo4j.com/developer/java/#_the_example_project 下载相应的开发语言驱动;熟悉spring 框架的开发可采用:
Spring Data Neo4j 框架;也提供了java api 驱动;spring data Neo4j 不适合节点庞杂的图形应用场合,过大的节点规模将导致低下的数据访问效率,大节点规模图形最好采用java 原生API进行数据的操作和查询;
1)pom.xml配置
spring提供了Spring Data Neo4j以实现对neo4j库的 查询和更新;pom.xml的配置如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-neo4j</artifactId>
<version>5.0.6.RELEASE </version>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j</artifactId>
<version>3.2.9</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-embedded-driver</artifactId>
<version>${neo4j-ogm.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-bolt-driver</artifactId>
<version>${neo4j-ogm.version}</version>
</dependency>
其中neo4j-ogm.version的版本为:3.1.0在pom.xml文件的属性中定义
2)代码结构
代码解构如图示意:
其中:Controller采用restful技术实习的控制器;service表示业务层,repositories表示持久层,domain表示数据模型;config主要实现对neo4j-ogm会话驱动的连接参数注入,因为不注入该连接参数,无法实现与neo4j的正常连接。
3)、代码示意:
a)主程序入口 单元代码:
@SpringBootApplication
@ComponentScan(basePackages = {"movies.spring.data.neo4j.controller", "movies.spring.data.neo4j.config","movies.spring.data.neo4j.services","movies.spring.data.neo4j.repositories"})
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
注意:需要将系统自动创建的各类bean的命名空间通过CompoentScan导入,因为是java的入门生,在最初尝试的时候就因为没有间配置类的命名空间导入,导致一直失败;
c)配置文件代码:
@Configuration
@EnableAutoConfiguration
@EnableTransactionManagement
@EnableNeo4jRepositories(basePackages = "movies.spring.data.neo4j.repositories")
public class Neo4jConfig {
@Value("${spring.data.neo4j.uri}")
private String databaseUrl;
@Value("${spring.data.neo4j.username}")
private String userName;
@Value("${spring.data.neo4j.password}")
private String password;
@Bean
public SessionFactory getSessionFactory() {
org.neo4j.ogm.config.Configuration configuration = new org.neo4j.ogm.config.Configuration.Builder()
.uri(databaseUrl)
.credentials(userName, password)
.build();
return new SessionFactory(configuration,"movies.spring.data.neo4j.domain");
}
}
注意:关于neo4j的正确连接配置为:
spring.data.neo4j.uri=bolt://localhost
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=123456
数据库连接 uri为:bolt://localhost ,采用http://localhost:7474不能正常连接数据库;同时因为默认采用ogm.properties中的配置也不能正常连接数据库,所以读取application.properties中的配置后注入到SessionFactory中
d)持久层代码
@Repository public interface MovieRepository extends Neo4jRepository<Movie, Long> { Movie findByTitle(@Param("title") String title); Collection<Movie> findByTitleLike(@Param("title") String title); @Query("MATCH (m:Movie)<-[r:ACTED_IN]-(a:Person) RETURN m,r,a LIMIT {limit}") Collection<Movie> graph(@Param("limit") int limit); }