Spring-Boot集成Neo4j图谱数据库+案例之创建与查询节点

接着上一篇讲


      上一篇,我们在Windows下安装并配置了Neo4j(图形数据库),并简单的利用脚本语句创建了图形关系案例,有了这个基础,接下来,就是集成到我们的项目中了,一如以往,集成到我们的Spring-Boot中



一、Spring-Boot目录结构图









二、Neo4j依赖包添加



Pom.xml文件中添加如下依赖:



<!-- 图形数据库Neo4j 官方支持的neo4j依赖包 -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-neo4j</artifactId>
</dependency>
<!-- neo4j数据库驱动包 -->




三、基于图形节点Coder进行实体Java类映射


(1)





(2)创建节点实体类Coder


A.




Coder.java


package com.appleyk.data.nodeentity;

import org.neo4j.ogm.annotation.GraphId;
import org.neo4j.ogm.annotation.NodeEntity;

/**
 * Neo4j的节点实体类:Coder
 * @author yukun24@126.com
 * @blob   http://blog.csdn.net/appleyk
 * @date   2018年1月18日-下午12:06:17
 */

@NodeEntity
public class Coder {

	/**
	 * Neo4j会分配的ID
	 */
	@GraphId
	private Long id;
	
	/**
	 * 属性
	 */
	private String name;
	private String sex ;
	private String hobby;
	
	public Coder(){
		
	}

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

	public String getHobby() {
		return hobby;
	}

	public void setHobby(String hobby) {
		this.hobby = hobby;
	}
}


注意,Coder类中的属性一定要和Neo4j图形数据库中的节点Coder的属性一一对应,否则映射失败!


注意Coder类用了Neo4j支持的一个注解@NodeEntity,表明该类是一个Neo4j支持的节点实体类



四、Coder节点实体类的增删改查接口



(类似于mybatis的mapper)



(1)GraphRepository:Neo4j的图形存储库,继承该接口,实现Coder类的增删改查









(2)


CoderRepositiory.java


package com.appleyk.data.Repository;

import org.apache.ibatis.annotations.Param;
import org.springframework.data.neo4j.repository.GraphRepository;
import org.springframework.stereotype.Repository;

import com.appleyk.data.nodeentity.Coder;


/**
 * Coder 节点增删改
 * @author yukun24@126.com
 * @blob   http://blog.csdn.net/appleyk
 * @date   2018年1月18日-下午12:10:53
 */

@Repository
public interface CoderRepositiory extends GraphRepository<Coder>{

	/*
	 CoderRepositiory 继承 GraphRepository类,实现增删查改
	 实现自己的接口:通过名字查询Coder(可以是单个节点,也可以是一组节点List集合)
	 spring-data-neo4j 支持方法命名约定查询 findBy{Coder的属性名}
	 findBy后面的属性名一定要在Coder节点实体类里存在,否则会报错 
	 */
	
	 Coder findByName(@Param("name") String name);

}


上面说过,这种方式类似于Mybatis的mapper,因此,只要继承了GraphRepository<T>接口基本上就够用了:






五、Spring-Boot全局属性文件配置Neo4j连接参数



#Neo4j配置
spring.data.neo4j.username=neo4j
spring.data.neo4j.password=n123
#数据库uri地址 
spring.data.neo4j.uri=http://localhost:7474









六、CoderController准备,进行节点查询(预热)



(1)restful风格api,查询方式为Get请求






(2)


CoderController.java


package com.appleyk.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.appleyk.data.Repository.CoderRepositiory;
import com.appleyk.data.nodeentity.Coder;

@RestController
@RequestMapping("/rest/v1.0.1/database/coder") //restful风格的api接口
public class CoderController {
	
	
	@Autowired
	CoderRepositiory coder;
	
	@RequestMapping("/get")
	public Coder GetCoderByName(@RequestParam(value="name") String name){
		return coder.findByName(name);
	}

}


查询走完,再走创建(save)



七、项目启动(run)






八、Coder节点(图形数据)查询接口调用



地址:http://localhost:8088/rest/v1.0.1/database/coder/get?name=鱼暖暖


(1) 提示连接失败(无效的用户名或者密码),无法提交请求








(2)模拟错误,就是为了避免采坑,且看我们的application.properties文件中的neo4j配置




(3)改过以后,我们再尝试一次调用





完美返回,我们再看一下,在我们的neo4j图形数据库中是不是一一对应







九、Coder节点(图形数据)的创建



(1)







Spring-Boot项目的全局数据源配置类:


package com.appleyk.config;

import java.util.Properties;

import javax.sql.DataSource;

import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.core.io.support.ResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import com.github.pagehelper.PageInterceptor;

@Configuration
//使用注解 @EnableTransactionManagement 开启事务支持后
//然后在访问数据库的Service方法上添加注解 @Transactional便可。
@EnableTransactionManagement 
@EnableConfigurationProperties(DataSourceProperties.class)
//扫描一切和Mapper有关的bean,因此,下面对整个项目进行"全身"扫描
@MapperScan("com.appleyk")
public class GlobalDataConfiguration {

	@Bean(name = "dataSource")
	//Spring 允许我们通过 @Qualifier注释指定注入 Bean 的名称
    @Qualifier(value = "dataSource")
    @ConfigurationProperties(prefix="jdbc")
	@Primary
    public DataSource dataSource()
    {
		return DataSourceBuilder.create().build();
    }

	//创建SqlSessionFactory
	@Bean(name = "sqlSessionFactory")
	public SqlSessionFactory sqlSessionFactoryBean(@Qualifier("dataSource") DataSource dataSource){
		
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
	
		//1.设置数据源
		bean.setDataSource(dataSource);
		//2.给包中的类注册别名,注册后可以直接使用类名,而不用使用全限定的类名(就是不用包含包名)
		bean.setTypeAliasesPackage("com.appleyk.database");
			
		// 设置MyBatis分页插件 【PageHelper 5.0.1设置方法】
        PageInterceptor pageInterceptor = new PageInterceptor();
        Properties properties = new Properties();
        properties.setProperty("helperDialect", "mysql");
        properties.setProperty("offsetAsPageNum", "true");
        properties.setProperty("rowBoundsWithCount", "true");
        pageInterceptor.setProperties(properties);
        
        //添加插件
        bean.setPlugins(new Interceptor[]{pageInterceptor});

        //添加XML目录,进行Mapper.xml扫描
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        try {
        	//项目中的xxxMapper.xml位于包com.appleyk.database下面
            bean.setMapperLocations(resolver.getResources("classpath*:com/appleyk/database/*.xml"));
         
            return bean.getObject();
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
        }       
	} 
	
	//创建SqlSessionTemplate
	@Bean
    public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
		
	
	@Bean(name = "transactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("dataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

}



(2)


CoderController.ajva


package com.appleyk.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.appleyk.data.Repository.CoderRepositiory;
import com.appleyk.data.nodeentity.Coder;
import com.appleyk.result.ResponseResult;

@RestController
@RequestMapping("/rest/v1.0.1/database/coder") //restful风格的api接口
public class CoderController {
	
	
	@Autowired
	CoderRepositiory coderRepositiory;
	
	@RequestMapping("/get")
	public Coder GetCoderByName(@RequestParam(value="name") String name){
		return coderRepositiory.findByName(name);
	}
	
	@PostMapping("/save")
	@Transactional
	public ResponseResult Create(@RequestBody Coder coder) throws Exception{
	   
		Coder result = coderRepositiory.save(coder);
	    if(result!=null){
	    	return new ResponseResult(200,result.getName()+"节点创建成功");
	    }
	    return new ResponseResult(500,coder.getName()+"节点创建失败!");
	}

}


(3)测试







(4)切面方法统计





(5)Neo4j图形数据库中查找刚才创建的节点name:"詹姆斯"


A.





B.











最后附上项目的github地址:



https://github.com/kobeyk/spring-boot-neo4j.git




  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 31
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 31
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值