Commit b4ced847 by qiuchaofei

1.添加neo4j driver的配置,2使用cypher语句查询关系,3添加接口:传入元数据id与层数,返回数据。4添加接口:返回所有关系类型。

parent 31118165
......@@ -143,6 +143,18 @@
<artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version>
</dependency>
<dependency>
<groupId>com.steelbridgelabs.oss</groupId>
<artifactId>neo4j-gremlin-bolt</artifactId>
<version>0.3.1</version>
</dependency>
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>1.7.5</version>
</dependency>
</dependencies>
<dependencyManagement>
......
package com.keymobile.metadata.metadataRelation.config;
import org.neo4j.driver.v1.AuthTokens;
import org.neo4j.driver.v1.Driver;
import org.neo4j.driver.v1.GraphDatabase;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class Neo4jConfig {
public class Neo4jConfig {
@Value("${spring.data.neo4j.url}")
private String neo4jUrl;
@Value("${spring.data.neo4j.username}")
private String neo4jUsername;
@Value("${spring.data.neo4j.password}")
private String neo4jPassword;
private static Driver driver;
@Bean
public Driver getNeo4jConnection() {
if(driver!=null){
}else {
driver = GraphDatabase.driver(neo4jUrl, AuthTokens.basic(neo4jUsername, neo4jPassword));
}
return driver;
}
}
......@@ -78,6 +78,33 @@ public class MetaDataController {
return metadataService.finAllMetaData();
}
/**
* 查询所有的关系类型
*/
@RequestMapping(path = "/listAllRelationType", method = RequestMethod.GET)
public List<String> getAllRelationType() {
return baseRelationshipService.findAllRelationTypes();
}
/**
* 传入元数据id,显示的层数,查找出与该元数据有关系的数据
*/
@RequestMapping(path = "/getNodeByDataId", method = RequestMethod.GET)
public ReturnReslult getNodeByDataId(String metadataId, int depth) {
return metadataService.findNodeByDataId(metadataId,depth);
}
/**
* 传入元数据id,查找出与该元数据有关系的数据
*/
@RequestMapping(path = "/getNodeByDataName", method = RequestMethod.GET)
public List<MetaData> getNodeByDataName(String metadataName) {
return metadataService.findNodeByName(metadataName);
}
/**
* 添加元数据的接口
......@@ -92,13 +119,13 @@ public class MetaDataController {
}
/**
* 同步元数据关系的接口,从mongo读取关系,存入到neo4j中
* 同步元数据关系的接口,传入一个环境名称(catalognName),从mongo读取关系,存入到neo4j中
* @return
*/
@RequestMapping(path = "/syschroRelationFromMongo", method = RequestMethod.GET)
public String syschroRelationFromMongo(){
public String syschroRelationFromMongo(String catalogName){
String flag = "success";
metadataService.syschroRelationFromMongo();
metadataService.syschroRelationFromMongo(catalogName);
return flag;
}
......
......@@ -3,9 +3,13 @@ package com.keymobile.metadata.metadataRelation.pojo.returnBean;
public class Edge {
private String edgeId;
private String fromId;
private String toId;
private String edgeId;
private String fromId;
private String toId;
private String type;
public String getEdgeId() {
return edgeId;
......@@ -39,7 +43,5 @@ public class Edge {
this.type = type;
}
private String type;
}
......@@ -2,7 +2,8 @@ package com.keymobile.metadata.metadataRelation.pojo.returnBean;
public class Node {
String id;
private String name;
private String id;
public String getId() {
return id;
......@@ -20,6 +21,5 @@ public class Node {
this.name = name;
}
String name;
}
package com.keymobile.metadata.metadataRelation.respository;
import com.keymobile.metadata.metadataRelation.pojo.MetaData;
import feign.Param;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public interface MetadataRepository extends Neo4jRepository<MetaData,Long> {
MetaData findMetadataByName(String name);
/**
* @Query("MATCH (n : MetaData { metadataId : $startId }), (n1 : MetaData { metadataId : $endId }), p=(n)-[]-(n1) return p")
* List<OutputRelation> findOutputRelationship(@Param("startId") String startId, @Param("endId") String endId);
* @param dataName
* @return
*/
@Query("match data=(na:MetaData{name:{0}})<-[rel*1..3]->(nb:MetaData) return data")
List<MetaData> findMetaData(@Param("dataName") String dataName , @Param("n") int n );
}
......@@ -15,6 +15,11 @@ public interface IBaseRelationshipService {
List<BaseRelationship> findAllRelation();
/**
* 查找所有的关系
*/
List<String> findAllRelationTypes();
/**
* @desc 添加关系
* @param relationship
*/
......
......@@ -2,12 +2,16 @@ package com.keymobile.metadata.metadataRelation.service;
import com.keymobile.metadata.metadataRelation.pojo.BaseRelationship;
import com.keymobile.metadata.metadataRelation.pojo.MetaData;
import com.keymobile.metadata.metadataRelation.pojo.returnBean.ReturnReslult;
import org.springframework.data.mongodb.core.query.Meta;
import java.util.List;
public interface IMetadataService {
List<MetaData> findNodeByName (String dataName);
ReturnReslult findNodeByDataId (String metadataId, int depth);
List<MetaData> finAllMetaData();
......@@ -23,7 +27,7 @@ public interface IMetadataService {
*/
MetaData addMetadataByName(String name);
void syschroRelationFromMongo();
void syschroRelationFromMongo(String catalogName);
/**
* 添加元数据对象
......
package com.keymobile.metadata.metadataRelation.service.impl;
import com.keymobile.metadata.metadataRelation.config.Neo4jConfig;
import com.keymobile.metadata.metadataRelation.pojo.*;
import com.keymobile.metadata.metadataRelation.pojo.returnBean.Edge;
import com.keymobile.metadata.metadataRelation.respository.*;
import com.keymobile.metadata.metadataRelation.service.IBaseRelationshipService;
import org.neo4j.driver.v1.Driver;
import org.neo4j.driver.v1.Record;
import org.neo4j.driver.v1.Session;
import org.neo4j.driver.v1.StatementResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
......@@ -14,6 +21,9 @@ import java.util.List;
@Service
public class BaseRelationshipServiceImpl implements IBaseRelationshipService {
private static final Logger logger = LoggerFactory.getLogger(BaseRelationshipServiceImpl.class);
@Autowired
BaseRelationshipRepository refRepository;
@Autowired
......@@ -60,6 +70,37 @@ public class BaseRelationshipServiceImpl implements IBaseRelationshipService {
}
@Override
public List<String> findAllRelationTypes() {
List<String> relationTypes = new ArrayList<>();
Neo4jConfig neo4jConfig = new Neo4jConfig();
Driver neo4jConnection = neo4jConfig.getNeo4jConnection();
Session session = neo4jConnection.session();
String cypher =" MATCH (n:MetaData)-[r]->() RETURN id(STARTNODE(r)) as startId,id(endNode(r)) as endId, type(r) as name";
logger.info("cypher:"+cypher);
StatementResult result = session.run(cypher);
while (result.hasNext()) {
Record record = (Record) result.next();
Long startId = record.get("startId").asLong();
Long endId = record.get("endId").asLong();
String name = record.get("name").asString();
// if (name == null || name.equals("null")) {
// name = startId + "-" + "relation" + "-" + endId;
// } else {
// name = startId + "-" + name + "-" + endId;
// }
if(!relationTypes.contains(name)){
relationTypes.add(name);
}
}
return relationTypes;
}
@Override
public BaseRelationship addRelationship(BaseRelationship relationship) {
return refRepository.save(relationship);
}
......
package com.keymobile.metadata.metadataRelation.service.impl;
import com.keymobile.metadata.metadataRelation.config.Neo4jConfig;
import com.keymobile.metadata.metadataRelation.pojo.*;
import com.keymobile.metadata.metadataRelation.pojo.returnBean.Edge;
import com.keymobile.metadata.metadataRelation.pojo.returnBean.ReturnReslult;
import com.keymobile.metadata.metadataRelation.remote.MetadataRepoRemoteService;
import com.keymobile.metadata.metadataRelation.respository.*;
import com.keymobile.metadata.metadataRelation.service.IBaseRelationshipService;
import com.keymobile.metadata.metadataRelation.service.IMetadataService;
import com.keymobile.metadata.metadataRelation.util.Neo4jTool;
import org.neo4j.driver.v1.*;
import org.neo4j.driver.v1.types.Node;
import org.neo4j.driver.v1.types.Path;
import org.neo4j.driver.v1.types.Relationship;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import sun.plugin.javascript.navig4.LayerArray;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
......@@ -15,6 +27,7 @@ import java.util.Map;
@Service
public class MetadataServiceImpl implements IMetadataService {
private static final Logger logger = LoggerFactory.getLogger(MetadataServiceImpl.class);
@Autowired
private MetadataRepository metadataRepository;
@Autowired
......@@ -35,6 +48,90 @@ public class MetadataServiceImpl implements IMetadataService {
@Autowired
private MetadataRepoRemoteService metadataRepoRemoteService;
@Override
public List<MetaData> findNodeByName(String dataName) {
return metadataRepository.findMetaData(dataName,3);
}
@Override
public ReturnReslult findNodeByDataId(String metadataId, int depth) {
ReturnReslult returnReslult = new ReturnReslult();
// List<MetaData> metaDataList = metadataRepository.findMetaData(metadataId,3);
List<MetaData> metaDataList = new ArrayList<>();
Neo4jConfig neo4jConfig = new Neo4jConfig();
Driver neo4jConnection = neo4jConfig.getNeo4jConnection();
Session session = neo4jConnection.session();
String cypher ="match data=(na:MetaData{metadataId:'"+metadataId+"'})<-[*1.."+depth+"]->(nb:MetaData) return data";
logger.info("cypher:"+cypher);
StatementResult result = session.run(cypher);
while ( result.hasNext() ){
Record record = result.next();
List<Value> values = record.values();
for (Value value : values) {
System.out.println(";;"+value.type());
if (value.type().name().equals("PATH")) {
Path p = value.asPath();
Iterable<Node> nodes = p.nodes();
Map<Long, MetaData> nodesMap = new HashMap<>();
for (Node node : nodes) {
Map<String, Object> stringObjectMap = node.asMap();
MetaData metaData = new MetaData();
Neo4jTool.transMap2Bean(stringObjectMap,metaData);
// metaDataList.add(data);
com.keymobile.metadata.metadataRelation.pojo.returnBean.Node returnNode = new com.keymobile.metadata.metadataRelation.pojo.returnBean.Node();
returnNode.setId(metaData.getMetadataId());
returnNode.setName(metaData.getName());
returnReslult.getNodes().add(returnNode);
nodesMap.put(node.id(), metaData);
}
Iterable<Relationship> relationships = p.relationships();
for (Relationship relationship : relationships) {
Long startID = relationship.startNodeId();
Long endID = relationship.endNodeId();
String rType = relationship.type();
/**
* asMap 相当于 节点的properties属性信息
*/
// relationship.id();
//
Edge edge = new Edge();
String relationName =
nodesMap.get(startID).getMetadataId() + "-" + rType + "-"
+ nodesMap.get(endID).getMetadataId();
edge.setEdgeId(String.valueOf(relationship.id()));
String startMetaId = "";
String endMEtaId ="";
if(nodesMap.containsKey(startID)){
startMetaId = nodesMap.get(startID).getMetadataId();
}
if(nodesMap.containsKey(endID)){
endMEtaId = nodesMap.get(endID).getMetadataId();
}
edge.setFromId(startMetaId);
edge.setToId(endMEtaId);
edge.setType(rType);
returnReslult.getEdges().add(edge);
}
}
}
}
return returnReslult;
}
@Override
public List<MetaData> finAllMetaData() {
return (List<MetaData>)metadataRepository.findAll();
......@@ -58,10 +155,10 @@ public class MetadataServiceImpl implements IMetadataService {
}
@Override
public void syschroRelationFromMongo() {
public void syschroRelationFromMongo(String catalogName) {
//先从mongo读取关系,写入neo4j
Map<String ,MetaData> metaDataMap = new HashMap<>();
List<RelationMongo> relationMongoList = mongoDbServiceImpl.findAll();
List<RelationMongo> relationMongoList = mongoDbServiceImpl.findAll(catalogName);
for(RelationMongo relationMongo:relationMongoList){
// 获取元数据属性
System.out.println(relationMongo.getId());
......
......@@ -21,7 +21,22 @@ public class MongoDbServiceImpl {
*
* @return
*/
public List<RelationMongo> findAll() {
public List<RelationMongo> findAll(String catalogName ) {
logger.info("--------------------->[MongoDB find start]");
try {
return mongoTemplate.findAll(RelationMongo.class,"md_relation_"+catalogName);
}catch (Exception e){
e.printStackTrace();
return null;
}
}
/**
* 查询所有
*
* @return
*/
public List<RelationMongo> findAll( ) {
logger.info("--------------------->[MongoDB find start]");
try {
return mongoTemplate.findAll(RelationMongo.class,"md_relational");
......
package com.keymobile.metadata.metadataRelation.util;
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.util.Map;
public class Neo4jTool {
// Map --> Bean 1: 利用Introspector,PropertyDescriptor实现 Map --> Bean
public static void transMap2Bean(Map<String, Object> map, Object obj) {
try {
BeanInfo beanInfo = Introspector.getBeanInfo(obj.getClass());
PropertyDescriptor[] propertyDescriptors = beanInfo.getPropertyDescriptors();
for (PropertyDescriptor property : propertyDescriptors) {
String key = property.getName();
if (map.containsKey(key)) {
Object value = map.get(key);
// 得到property对应的setter方法
Method setter = property.getWriteMethod();
if(setter!=null) {
try {
setter.invoke(obj, value);
} catch (Exception e) {
setter.invoke(obj, value + "");
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
System.out.println("transMap2Bean Error " + e);
}
return;
}
}
......@@ -9,6 +9,7 @@ spring:
data:
neo4j:
uri: http://127.0.0.1:7474
url: bolt://localhost:7687
username: neo4j
password: yuanyao
main:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment