SpringBoot如何结合Neo4j自定义cypherSql
发表于:2024-11-26 作者:千家信息网编辑
千家信息网最后更新 2024年11月26日,这篇文章主要为大家展示了"SpringBoot如何结合Neo4j自定义cypherSql",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SpringBoot
千家信息网最后更新 2024年11月26日SpringBoot如何结合Neo4j自定义cypherSql
这篇文章主要为大家展示了"SpringBoot如何结合Neo4j自定义cypherSql",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SpringBoot如何结合Neo4j自定义cypherSql"这篇文章吧。
前言
SpringBoot引入neo4j
org.springframework.boot spring-boot-starter-data-neo4j
2.2.11.RELEASE
大多数时候Neo4j结合springboot都是按照实体类的映射,进行对象形式的创建节点,导致了节点属性的不可配性。结合这种问题,结合目前开发经验,可以使用neo4j 框架的session 进行原生cypherSql的执行。所以结合使用session进行动态可配等思路,建立一个Neo4jUtil..
Neo4jUtil作用
SpringBoot结合neo4j,自定义封装cypherSql进行操作。实际就是使用neo4j的Session.执行一些cypherSql操作,然后封装了一些方法供大家在既可以使用springboot的对象化操作方式的前提创建节点或者关系,也可以自定义继续封装一些特殊需求的方法,避免大家造轮子。
相关代码
application.yml
spring: data: neo4j: uri: bolt://127.0.0.1:7688 username: neo4j password: neo4j
config
package com.troy.keeper.modules.desk.config;import org.neo4j.ogm.session.SessionFactory;import org.springframework.beans.factory.annotation.Value;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.neo4j.repository.config.EnableNeo4jRepositories;import org.springframework.data.neo4j.transaction.Neo4jTransactionManager;@Configuration@EnableNeo4jRepositories("com.troy.keeper.desc.repository") // 声明neo4j repository存放地址public class Neo4jConfig { @Value("${spring.data.neo4j.uri}") private String uri; @Value("${spring.data.neo4j.username}") private String userName; @Value("${spring.data.neo4j.password}") private String password; @Bean public org.neo4j.ogm.config.Configuration getConfiguration() { org.neo4j.ogm.config.Configuration configuration = new org.neo4j.ogm.config.Configuration.Builder().uri(uri).connectionPoolSize(100).credentials(userName, password).withBasePackages("com.troy.keeper.desc.repository").build(); return configuration; } @Bean public SessionFactory sessionFactory() { return new SessionFactory(getConfiguration()); } @Bean("neo4jTransaction") public Neo4jTransactionManager neo4jTransactionManager(SessionFactory sessionFactory) { return new Neo4jTransactionManager(sessionFactory); }}
Entity
Neo4jBasicNode
//节点实体类package com.troy.keeper.modules.desk.entity.neo4j;import lombok.Data;import java.io.Serializable;import java.util.List;import java.util.Map;/** * neo4j 节点实体类 * @author YangBM */@Datapublic class Neo4jBasicNode implements Serializable { private static final long serialVersionUID = 1L; /** * id */ private Long id; /** * 标签 */ private Listlabels; /** * 标签属性 */ private Map property;}
Neo4jBaiscRelation
//关系实体类package com.troy.keeper.modules.desk.entity.neo4j;import lombok.Data;import java.io.Serializable;import java.util.Map;/** * 关系 */@Datapublic class Neo4jBaiscRelation implements Serializable { private static final long serialVersionUID = 1L; /** * id */ private Long id; /** * 标签 */ private String type; /** * 标签属性 */ private Mapproperty;}
Neo4jQueryRelation
//查询关系的时候返回的对象封装的实体类package com.troy.keeper.modules.desk.entity.neo4j;import lombok.Data;import java.io.Serializable;import java.util.Map;/** * 关系 * @author YangBM */@Datapublic class Neo4jQueryRelation implements Serializable { private static final long serialVersionUID = 1L; /** * 开始节点id */ private Long start; /** * 结束节点id */ private Long end; /** * 关系类型 */ private String type; /** * id */ private Long id; /** * 标签属性 */ private Mapproperty;}
VO
Neo4jBasicRelationReturnVO
package com.troy.keeper.modules.desk.vo.neo4j;import com.troy.keeper.modules.desk.entity.neo4j.Neo4jBasicNode;import com.troy.keeper.modules.desk.entity.neo4j.Neo4jQueryRelation;import lombok.Data;import java.io.Serializable;/** * 基础返回关系VO * 关系 * @author YangBM */@Datapublic class Neo4jBasicRelationReturnVO implements Serializable { private static final long serialVersionUID = 1L; private Neo4jBasicNode start; private Neo4jQueryRelation relationship; private Neo4jBasicNode end;}
RelationVO
package com.troy.keeper.modules.desk.vo.neo4j;import lombok.Data;/** * 将关系的实体类,转换换成cypherSql需要字符串类型的vo * Util里面会用到 * @author YangBM */@Datapublic class RelationVO { /** * 关系名称 */ private String relationLabelName; /** * 开始标签名称 */ private String startLabelName; /** * 开始节点条件 */ private String startNodeProperties; /** * 关系的属性 */ private String relationProperties; /** * 结束节点条件 */ private String endNodeProperties; /** * 结束标签名称 */ private String endLabelName; /** * 查询层级 */ private String level;}
Util
Neo4jUtil
package com.troy.keeper.modules.desk.util;import com.fasterxml.jackson.core.JsonGenerator;import com.fasterxml.jackson.databind.ObjectMapper;import com.troy.keeper.core.tool.utils.BeanUtil;import com.troy.keeper.core.tool.utils.Func;import com.troy.keeper.modules.desk.dto.neo4j.Neo4jSaveRelationDTO;import com.troy.keeper.modules.desk.dto.neo4j.RelationDTO;import com.troy.keeper.modules.desk.entity.neo4j.Neo4jBaiscRelation;import com.troy.keeper.modules.desk.entity.neo4j.Neo4jBasicNode;import com.troy.keeper.modules.desk.entity.neo4j.Neo4jQueryRelation;import com.troy.keeper.modules.desk.vo.neo4j.Neo4jBasicRelationReturnVO;import com.troy.keeper.modules.desk.vo.neo4j.RelationVO;import lombok.SneakyThrows;import org.apache.commons.collections.IteratorUtils;import org.apache.commons.lang3.StringUtils;import org.neo4j.driver.internal.InternalPath;import org.neo4j.driver.types.Node;import org.neo4j.driver.types.Relationship;import org.neo4j.ogm.model.Property;import org.neo4j.ogm.model.Result;import org.neo4j.ogm.response.model.NodeModel;import org.neo4j.ogm.session.Session;import org.springframework.stereotype.Component;import javax.annotation.Resource;import java.util.*;/** * @author YangBM * Neo4J工具类 */@Componentpublic class Neo4jUtil { /** * init map序列号 */ private static final ObjectMapper mapper = new ObjectMapper(); static { mapper.configure(JsonGenerator.Feature.QUOTE_FIELD_NAMES, false); } @SneakyThrows public static String propertiesMapToPropertiesStr(Mapmap) { map.entrySet().removeIf(entry -> Func.isEmpty(entry.getValue())); return mapper.writeValueAsString(map); } @Resource private Session session; public Session getSession() { return this.session; } /** * 获取所有的标签名称 * * @return */ public List getAllLabelName() { String cypherSql = "match (n) return distinct labels(n) as name"; Result query = session.query(cypherSql, new HashMap<>()); ArrayList labelNames = new ArrayList<>(); for (Map map : query.queryResults()) { String[] names = (String[]) map.get("name"); for (String name : names) { labelNames.add(name); } } return labelNames; } /** * 获取所有的关系名称 * * @return */ public List getAllRelationName() { String cypherSql = "MATCH ()-[r]-() RETURN distinct type(r) as name"; Result query = session.query(cypherSql, new HashMap<>()); ArrayList relationNames = new ArrayList<>(); for (Map map : query.queryResults()) { relationNames.add(map.get("name").toString()); } return relationNames; } /** * 按条件查询节点 * * @param node * @return 返回节点集合 */ public List queryNode(Neo4jBasicNode node) { String cypherSql = ""; if (Func.isNotEmpty(node.getId())) { cypherSql = String.format("MATCH (n) where id(n)=%s return n", node.getId()); } else { String labels = ""; if (Func.isNotEmpty(node.getLabels())) { labels = ":`" + String.join("`:`", node.getLabels()) + "`"; } String property = ""; if (Func.isNotEmpty(node.getProperty())) { property = Neo4jUtil.propertiesMapToPropertiesStr(node.getProperty()); } cypherSql = String.format("match(n%s%s) return n", labels, property); } Result query = session.query(cypherSql, new HashMap<>()); ArrayList nodeList = new ArrayList<>(); Iterable
以上是"SpringBoot如何结合Neo4j自定义cypherSql"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!
节点
标签
属性
查询
名称
实体
条件
方法
封装
内容
对象
篇文章
类型
验证
成功
个数
参数
方式
时候
处理
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
网络安全大战图片
小学生网络安全知识手抄报简单
p2p网络技术原理pdf
软件开发和程序设计区别
昆山java软件开发培训
软件开发如何能接到私活
ubuntu的软件开发
软件开发公司注册费用
延庆区咨询软件开发大概费用
金州区软件开发
临海库存软件开发定制价格
网络安全素养课程
用户对数据库中的数据进行每一次
吴江区便宜服务器货源充足
360分拆网络安全
蜀山传奇数据库
网络安全文化包括哪些内容
火的语音对讲软件开发
公司网络技术员绩效表
软件开发难还是需求分析难
前端中怎么做软件开发
公安网络安全保密纪律
添加access数据库
大学生参军网络安全
网络安全体和网络交会模型
网络安全素养课程
江西pdu服务器专用电源费用
山西网络安全会议
杭州市网络技术监督管理局
网络安全学校多少分