Commit b4ced847 by qiuchaofei

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

parent 31118165
...@@ -143,6 +143,18 @@ ...@@ -143,6 +143,18 @@
<artifactId>jasypt-spring-boot-starter</artifactId> <artifactId>jasypt-spring-boot-starter</artifactId>
<version>3.0.3</version> <version>3.0.3</version>
</dependency> </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> </dependencies>
<dependencyManagement> <dependencyManagement>
......
package com.keymobile.metadata.metadataRelation.config; 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; import org.springframework.context.annotation.Configuration;
@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 { ...@@ -78,6 +78,33 @@ public class MetaDataController {
return metadataService.finAllMetaData(); 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 { ...@@ -92,13 +119,13 @@ public class MetaDataController {
} }
/** /**
* 同步元数据关系的接口,从mongo读取关系,存入到neo4j中 * 同步元数据关系的接口,传入一个环境名称(catalognName),从mongo读取关系,存入到neo4j中
* @return * @return
*/ */
@RequestMapping(path = "/syschroRelationFromMongo", method = RequestMethod.GET) @RequestMapping(path = "/syschroRelationFromMongo", method = RequestMethod.GET)
public String syschroRelationFromMongo(){ public String syschroRelationFromMongo(String catalogName){
String flag = "success"; String flag = "success";
metadataService.syschroRelationFromMongo(); metadataService.syschroRelationFromMongo(catalogName);
return flag; return flag;
} }
......
...@@ -6,6 +6,10 @@ public class Edge { ...@@ -6,6 +6,10 @@ public class Edge {
private String edgeId; private String edgeId;
private String fromId; private String fromId;
private String toId; private String toId;
private String type;
public String getEdgeId() { public String getEdgeId() {
return edgeId; return edgeId;
...@@ -39,7 +43,5 @@ public class Edge { ...@@ -39,7 +43,5 @@ public class Edge {
this.type = type; this.type = type;
} }
private String type;
} }
...@@ -2,7 +2,8 @@ package com.keymobile.metadata.metadataRelation.pojo.returnBean; ...@@ -2,7 +2,8 @@ package com.keymobile.metadata.metadataRelation.pojo.returnBean;
public class Node { public class Node {
String id; private String name;
private String id;
public String getId() { public String getId() {
return id; return id;
...@@ -20,6 +21,5 @@ public class Node { ...@@ -20,6 +21,5 @@ public class Node {
this.name = name; this.name = name;
} }
String name;
} }
package com.keymobile.metadata.metadataRelation.respository; package com.keymobile.metadata.metadataRelation.respository;
import com.keymobile.metadata.metadataRelation.pojo.MetaData; import com.keymobile.metadata.metadataRelation.pojo.MetaData;
import feign.Param; import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.neo4j.repository.Neo4jRepository; import org.springframework.data.neo4j.repository.Neo4jRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
import java.util.List;
@Repository @Repository
public interface MetadataRepository extends Neo4jRepository<MetaData,Long> { public interface MetadataRepository extends Neo4jRepository<MetaData,Long> {
MetaData findMetadataByName(String name); 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 { ...@@ -15,6 +15,11 @@ public interface IBaseRelationshipService {
List<BaseRelationship> findAllRelation(); List<BaseRelationship> findAllRelation();
/** /**
* 查找所有的关系
*/
List<String> findAllRelationTypes();
/**
* @desc 添加关系 * @desc 添加关系
* @param relationship * @param relationship
*/ */
......
...@@ -2,12 +2,16 @@ package com.keymobile.metadata.metadataRelation.service; ...@@ -2,12 +2,16 @@ package com.keymobile.metadata.metadataRelation.service;
import com.keymobile.metadata.metadataRelation.pojo.BaseRelationship; import com.keymobile.metadata.metadataRelation.pojo.BaseRelationship;
import com.keymobile.metadata.metadataRelation.pojo.MetaData; import com.keymobile.metadata.metadataRelation.pojo.MetaData;
import com.keymobile.metadata.metadataRelation.pojo.returnBean.ReturnReslult;
import org.springframework.data.mongodb.core.query.Meta; import org.springframework.data.mongodb.core.query.Meta;
import java.util.List; import java.util.List;
public interface IMetadataService { public interface IMetadataService {
List<MetaData> findNodeByName (String dataName);
ReturnReslult findNodeByDataId (String metadataId, int depth);
List<MetaData> finAllMetaData(); List<MetaData> finAllMetaData();
...@@ -23,7 +27,7 @@ public interface IMetadataService { ...@@ -23,7 +27,7 @@ public interface IMetadataService {
*/ */
MetaData addMetadataByName(String name); MetaData addMetadataByName(String name);
void syschroRelationFromMongo(); void syschroRelationFromMongo(String catalogName);
/** /**
* 添加元数据对象 * 添加元数据对象
......
package com.keymobile.metadata.metadataRelation.service.impl; 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.*;
import com.keymobile.metadata.metadataRelation.pojo.returnBean.Edge; import com.keymobile.metadata.metadataRelation.pojo.returnBean.Edge;
import com.keymobile.metadata.metadataRelation.respository.*; import com.keymobile.metadata.metadataRelation.respository.*;
import com.keymobile.metadata.metadataRelation.service.IBaseRelationshipService; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
...@@ -14,6 +21,9 @@ import java.util.List; ...@@ -14,6 +21,9 @@ import java.util.List;
@Service @Service
public class BaseRelationshipServiceImpl implements IBaseRelationshipService { public class BaseRelationshipServiceImpl implements IBaseRelationshipService {
private static final Logger logger = LoggerFactory.getLogger(BaseRelationshipServiceImpl.class);
@Autowired @Autowired
BaseRelationshipRepository refRepository; BaseRelationshipRepository refRepository;
@Autowired @Autowired
...@@ -60,6 +70,37 @@ public class BaseRelationshipServiceImpl implements IBaseRelationshipService { ...@@ -60,6 +70,37 @@ public class BaseRelationshipServiceImpl implements IBaseRelationshipService {
} }
@Override @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) { public BaseRelationship addRelationship(BaseRelationship relationship) {
return refRepository.save(relationship); return refRepository.save(relationship);
} }
......
package com.keymobile.metadata.metadataRelation.service.impl; 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.*;
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.remote.MetadataRepoRemoteService;
import com.keymobile.metadata.metadataRelation.respository.*; import com.keymobile.metadata.metadataRelation.respository.*;
import com.keymobile.metadata.metadataRelation.service.IBaseRelationshipService; import com.keymobile.metadata.metadataRelation.service.IBaseRelationshipService;
import com.keymobile.metadata.metadataRelation.service.IMetadataService; 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.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import sun.plugin.javascript.navig4.LayerArray;
import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
...@@ -15,6 +27,7 @@ import java.util.Map; ...@@ -15,6 +27,7 @@ import java.util.Map;
@Service @Service
public class MetadataServiceImpl implements IMetadataService { public class MetadataServiceImpl implements IMetadataService {
private static final Logger logger = LoggerFactory.getLogger(MetadataServiceImpl.class);
@Autowired @Autowired
private MetadataRepository metadataRepository; private MetadataRepository metadataRepository;
@Autowired @Autowired
...@@ -35,6 +48,90 @@ public class MetadataServiceImpl implements IMetadataService { ...@@ -35,6 +48,90 @@ public class MetadataServiceImpl implements IMetadataService {
@Autowired @Autowired
private MetadataRepoRemoteService metadataRepoRemoteService; 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 @Override
public List<MetaData> finAllMetaData() { public List<MetaData> finAllMetaData() {
return (List<MetaData>)metadataRepository.findAll(); return (List<MetaData>)metadataRepository.findAll();
...@@ -58,10 +155,10 @@ public class MetadataServiceImpl implements IMetadataService { ...@@ -58,10 +155,10 @@ public class MetadataServiceImpl implements IMetadataService {
} }
@Override @Override
public void syschroRelationFromMongo() { public void syschroRelationFromMongo(String catalogName) {
//先从mongo读取关系,写入neo4j //先从mongo读取关系,写入neo4j
Map<String ,MetaData> metaDataMap = new HashMap<>(); Map<String ,MetaData> metaDataMap = new HashMap<>();
List<RelationMongo> relationMongoList = mongoDbServiceImpl.findAll(); List<RelationMongo> relationMongoList = mongoDbServiceImpl.findAll(catalogName);
for(RelationMongo relationMongo:relationMongoList){ for(RelationMongo relationMongo:relationMongoList){
// 获取元数据属性 // 获取元数据属性
System.out.println(relationMongo.getId()); System.out.println(relationMongo.getId());
......
...@@ -21,7 +21,22 @@ public class MongoDbServiceImpl { ...@@ -21,7 +21,22 @@ public class MongoDbServiceImpl {
* *
* @return * @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]"); logger.info("--------------------->[MongoDB find start]");
try { try {
return mongoTemplate.findAll(RelationMongo.class,"md_relational"); 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: ...@@ -9,6 +9,7 @@ spring:
data: data:
neo4j: neo4j:
uri: http://127.0.0.1:7474 uri: http://127.0.0.1:7474
url: bolt://localhost:7687
username: neo4j username: neo4j
password: yuanyao password: yuanyao
main: 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