Neo4j+Mysql+java实现基本功能(一)

Neo4j+Mysql+java实现基本功能(一) -- 连接neo4j

写在前面

这篇文章主要为基础配置,后续代码及功能查看后续文章。
默认neo4j已完成安装,且运行成功了,如果需要可以查看他人博客:点击查看安装教程
注意它里面 有其它java的JDK没有其它JDK的区别
基础配置及环境信息:
1、meysql:5.7
2、neo4j:4.4.5社区版
3、idea + springBoot + myBatis
4、java:JDK1.8 + JDK11
5、windows10

框架搭建

此时默认已配置并写好了MySql。后续仅为连接neo4j

  1. 给出一个文件包 ,保存所有需要用到的neo4j代码;
    在这里插入图片描述 1.1、说明:所有neo4j代码都在neo4j文件夹下
    config:自测时所需配置文件
    controller:Controller
    entry:实体对象
    repository:sql层,类似与dao
    service:接口层

  2. 导包(此处仅neo4j包),以maven导入neo4j4.4.5为例:
    仅用maven导包时间会比较长,可以先编写后续代码
    注意:导入完成后spring-boot-starter-data-neo4j包的driver可能会报错,这是驱动不匹配的原因,后续第二个包就是引用对应的驱动,引入成功后不用管前一个包的报错信息

 		<!-- neo4j -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-neo4j</artifactId>
        </dependency>
        <dependency>
            <groupId>org.neo4j.driver</groupId>
            <artifactId>neo4j-java-driver</artifactId>
            <version>4.4.5</version>
        </dependency>
  1. 配置Swagger:
    此处使用同一个目录层级,或swagger自动扫描到了就不用配置,我这是无法扫描到多包下的Controller,所以重写了匹配方式,SwaggerConfig.java 完整代码如下:
import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j;
import com.google.common.base.Function;
import com.google.common.base.Optional;
import com.google.common.base.Predicate;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.RequestHandler;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
@EnableKnife4j
public class SwaggerConfig {

	// 定义分隔符,配置Swagger多包
	private static final String splitor = ";";

	/**
	 * 是否开启swagger,生产环境一般关闭
	 */
	@Value("${swagger.enabled}")
	private boolean enabled;

	@Bean
	public Docket CreatRestApi() {
		return new Docket(DocumentationType.SWAGGER_2)
				// 详细定制
				.apiInfo(apiInfo())
				.select()
				// 指定当前包路径,这里就添加了两个包,注意方法变成了basePackage,中间加上成员变量splitor
				.apis(basePackage("com.xxxxxx.web"+splitor+"com.xxxxxx.neo4j.controller"))
				// 扫描所有 .apis(RequestHandlerSelectors.any())
				.paths(PathSelectors.any())
				.build();
	}

	private ApiInfo apiInfo() {
		return new ApiInfoBuilder().title("项目API接口").description("接口列表")
				.version("1.0").build();

	}

	/**
	 * 重写basePackage方法,使能够实现多包访问,复制贴上去
	 * @param basePackage 多包字符串,用 ";"分隔
	 * @return com.google.common.base.Predicate<springfox.documentation.RequestHandler>
	 */
	public static Predicate<RequestHandler> basePackage(final String basePackage) {
		//获取下面两个包中所有类(扫描)
		return input -> declaringClass(input).transform(handlerPackage(basePackage)).or(true);
	}

	/**
	 * 新增处理,分割包,并合并扫描
	 * @param basePackage
	 * @return
	 */
	private static Function<Class<?>, Boolean> handlerPackage(final String basePackage)     {
		//循环判断,是否是包含包路径
		return input -> {
			// 循环判断匹配
			for (String strPackage : basePackage.split(splitor)) {
				if (input.getPackage().getName().startsWith(strPackage)) {
					return true;
				}
			}
			return false;
		};
	}

	private static Optional<? extends Class<?>> declaringClass(RequestHandler input) {
		return Optional.fromNullable(input.getClass().getEnclosingClass());
	}
}

实现自测代码

  1. Neo4jConfig.java:放置到neo4j.config目录下
import org.neo4j.driver.AuthTokens;
import org.neo4j.driver.Driver;
import org.neo4j.driver.GraphDatabase;
import org.neo4j.driver.Session;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class Neo4jConfig {

    @Bean
    public Driver neo4jDriver() {
        return GraphDatabase.driver("neo4j://localhost:7687", AuthTokens.basic("neo4j","123456"));
    }

    @Bean
    public Session neo4jSession() {
        return neo4jDriver().session();
    }
}

GraphDatabase.driver:配置驱动
neo4j://localhost:7687:进入neo4j后可以看到:
在这里插入图片描述

AuthTokens.basic(“neo4j”,“123456”):账号、密码

  1. 测试接口
    ExampleNeo4jService.java:放到neo4j.service下
import org.springframework.stereotype.Service;

@Service
public interface ExampleNeo4jService {

    void executeNeo4jQuery() ;
}
ExampleNeo4jServiceImpl.java: 放到neo4j.service.impl下

import com.xxxxxx.neo4j.service.ExampleNeo4jService;
import org.neo4j.driver.*;
import org.neo4j.driver.types.Node;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;


@Service
public class ExampleNeo4jServiceImpl implements ExampleNeo4jService {

    private static final Logger logger = LoggerFactory.getLogger(ExampleNeo4jServiceImpl.class);

    @Autowired
    private Session neo4jSession;

    public void executeNeo4jQuery() {
        String query = "MATCH (n:separation) RETURN n LIMIT 25";
        neo4jSession.readTransaction(tx -> {
            Result result = tx.run(query);
            while (result.hasNext()) {
                Record record = result.next();
                Node node = record.get("n").asNode();
                logger.info("Node name: {}", node.get("separation_name").asString());
            }
            return null;
        });
    }
}
说明(neo4j标签里面要有数据):
MATCH (n:separation):查询separation标签下的数据,命名为 ‘n’,类似与sql的 select * form separation as n , 注意大小写
RETURN n LIMIT 25:返回已查询到的n,限制25个
record.get(“n”).asNode();获取返回的n
只要有数据就说明连接成功

测试方式

直接触发就好,不论是junit 还是 Controller 都行,下面我用的是junit
test.java:放在 xxx.src.test.java.impl.test.java

import com.xxxxxx.DrawingApplication;
import com.xxxxxx.neo4j.service.ExampleNeo4jService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = XXXApplication.class)
public class test {

    @Resource
    private ExampleNeo4jService exampleNeo4jService;

    @Test
    public void testAddStation2() {
        exampleNeo4jService.executeNeo4jQuery();
    }

}

其它连接

  1. 安装配置neo4j:点击跳转

  2. neo4j 实体对象增删查询: 还没写

  3. neo4j 实体及实体关系和对应关系对象查询: 还没写
    3.1.实体对象关系查询改写:还没研究出来

  4. sql及neo4j联动: 还没写

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中同时开启 Neo4jMySQL 的事务可以使用 Spring 的编程式事务管理来实现。具体操作步骤如下: 1. 在 Spring 配置文件中配置数据源和事务管理器。 ``` <bean id="neo4jDataSource" class="org.neo4j.jdbc.bolt.BoltDataSource"> <constructor-arg index="0" value="bolt://localhost:7687"/> <constructor-arg index="1" value="neo4j"/> <constructor-arg index="2" value="password"/> </bean> <bean id="mysqlDataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/dbname"/> <property name="username" value="username"/> <property name="password" value="password"/> </bean> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="mysqlDataSource"/> </bean> ``` 2. 在 Java 代码中使用 `TransactionTemplate` 来同时开启 Neo4jMySQL 的事务。 ``` @Autowired private DataSource neo4jDataSource; @Autowired private DataSource mysqlDataSource; @Autowired private TransactionTemplate transactionTemplate; public void doTransaction() { transactionTemplate.execute(new TransactionCallbackWithoutResult() { protected void doInTransactionWithoutResult(TransactionStatus status) { try (Connection neo4jConnection = neo4jDataSource.getConnection(); Connection mysqlConnection = mysqlDataSource.getConnection()) { neo4jConnection.setAutoCommit(false); mysqlConnection.setAutoCommit(false); // 在 Neo4j 中执行事务操作 // ... // 在 MySQL 中执行事务操作 // ... neo4jConnection.commit(); mysqlConnection.commit(); } catch (Exception e) { status.setRollbackOnly(); throw new RuntimeException("Transaction rolled back.", e); } } }); } ``` 在以上代码中,我们使用了 `TransactionTemplate` 来开启事务,并且将 Neo4jMySQL 的数据源分别注入到了代码中。在事务中,我们可以通过获取对应的数据库连接对象,然后手动开启、提交和回滚事务。在出现异常时,我们需要将事务状态标记为回滚状态,并抛出异常让 Spring 框架自动回滚事务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值