Spring boot 整合Neo4j 实现动态Cypher

本文介绍了如何在SpringBoot应用中利用Neo4j Object-Graph Mapping (OGM) 实现更灵活的动态查询。通过创建自定义的NodeService并使用SessionFactory,我们可以动态拼接Cypher查询语言,执行复杂查询。同时,文章还提到了在事务管理中优化Session获取的方法,以确保在事务中正确使用Session。
摘要由CSDN通过智能技术生成

提到spring boot整合Neo4j,一般都会提到spring-data-neo4j,使用类似于jpa的方式,使用entity去maintain,但是如果想要添加动态关系或者动态的node,就算是@Query也是不够用了

使用OGM

其实这个包也被spring-data-neo4j引入了,所以不必要单独引入
在这里插入图片描述


import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.neo4j.ogm.model.Result;

@Service
public class NodeService {

    private final Logger log = LoggerFactory.getLogger(NodeService.class);

    @Autowired
    private SessionFactory sessionFactory;

    public Result searchPath(SearchPathDTO searchPathDTO) {
        String cypher = "MATCH (n:" + searchPathDTO.getFromNode() + "{" + searchPathDTO.getProperity() + ":'"
                + searchPathDTO.getValue() + "'}) "
                + "CALL apoc.path.subgraphAll(n,{relationshipFilter: '<|>',minLevel: 0,maxLevel: -1}) "
                + "YIELD nodes,relationships RETURN nodes, relationships";
        Session session = sessionFactory.openSession();
        return session.query(cypher, new HashMap<>(), false);
    }
  }

这样以来,就可以动态拼接cypher,更加灵活,可以实现更加复杂的查询了.

优化

这样获取session会有一个问题,就是在使用事务的时候无法统一管理.

优化之后写一个公共Util类,获取session的时候调用这个类,把sessionFactory传进来就可以了


import org.neo4j.ogm.session.Session;
import org.neo4j.ogm.session.SessionFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.data.neo4j.transaction.SessionHolder;
import org.springframework.transaction.support.TransactionSynchronizationManager;

public class TransactionUtils {
	
	private static final Logger log = LoggerFactory.getLogger(TransactionUtils.class);
	
	private TransactionUtils() {
    }
	
	public static Session getSession(SessionFactory sessionFactory) {
		SessionHolder sessionHolder = (SessionHolder) TransactionSynchronizationManager.getResource(sessionFactory);
		if (sessionHolder == null) {
			log.error("Can not get seesion from spring neo4j sessionHolder, the previously created transaction will be invalidated.");
			Session session = sessionFactory.openSession();
			return session;
		}
		return sessionHolder.getSession();
    }
}

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值