@ -4,14 +4,15 @@ import cn.hutool.core.util.StrUtil;
import cn.hutool.poi.excel.ExcelReader ;
import cn.hutool.poi.excel.ExcelUtil ;
import com.supervision.common.domain.R ;
import com.supervision.common.utils.StringUtils ;
import com.supervision.neo4j.domain.CaseNode ;
import com.supervision.neo4j.domain.Rel ;
import com.supervision.neo4j.dto.WebRelDTO ;
import com.supervision.neo4j.service.Neo4jService ;
import com.supervision.neo4j.utils.Neo4jUtils ;
import com.supervision.police.vo.GraphReqVO ;
import lombok.Data ;
import lombok.extern.slf4j.Slf4j ;
import org.apache.commons.lang3.StringUtils ;
import org.neo4j.driver.Record ;
import org.neo4j.driver.* ;
import org.springframework.beans.factory.annotation.Autowired ;
@ -50,7 +51,7 @@ public class Neo4jServiceImpl implements Neo4jService {
CaseNode res = null ;
try {
Session session = driver . session ( ) ;
StringBu ffer cql = new StringBuff er( ) ;
StringBu ilder cql = new StringBuild er( ) ;
Map < String , Object > params = new HashMap < > ( ) ;
cql . append ( "CREATE (n:" ) . append ( caseNode . getNodeType ( ) ) . append ( "{name:$name" ) ;
params . put ( "name" , caseNode . getName ( ) ) ;
@ -74,7 +75,7 @@ public class Neo4jServiceImpl implements Neo4jService {
Result run = session . run ( cql . toString ( ) , params ) ;
res = Neo4jUtils . getOneNode ( run ) ;
} catch ( Exception e ) {
e. printStackTrace ( ) ;
log. error ( e . getMessage ( ) , e ) ;
}
return res ;
}
@ -88,13 +89,12 @@ public class Neo4jServiceImpl implements Neo4jService {
public void delNode ( Long id ) {
try {
Session session = driver . session ( ) ;
StringBu ffer cql = new StringBuff er( ) ;
StringBu ilder cql = new StringBuild er( ) ;
cql . append ( "MATCH (n) where id(n) = " ) . append ( id ) . append ( " DELETE n" ) ;
log . info ( cql . toString ( ) ) ;
Result run = session . run ( cql . toString ( ) ) ;
while ( run . hasNext ( ) ) {
Record next = run . next ( ) ;
// log.info(next.toString());
run . next ( ) ;
}
} catch ( Exception e ) {
log . error ( e . getMessage ( ) , e ) ;
@ -105,13 +105,12 @@ public class Neo4jServiceImpl implements Neo4jService {
public void deleteNoRelationNode ( Long id ) {
try {
Session session = driver . session ( ) ;
StringBu ffer cql = new StringBuff er( ) ;
StringBu ilder cql = new StringBuild er( ) ;
cql . append ( "MATCH (n) WHERE n.id = " ) . append ( id ) . append ( " AND NOT (n)--() DELETE n" ) ;
log . info ( cql . toString ( ) ) ;
Result run = session . run ( cql . toString ( ) ) ;
while ( run . hasNext ( ) ) {
Record next = run . next ( ) ;
// log.info(next.toString());
run . next ( ) ;
}
} catch ( Exception e ) {
log . error ( e . getMessage ( ) , e ) ;
@ -131,11 +130,10 @@ public class Neo4jServiceImpl implements Neo4jService {
log . info ( cql . toString ( ) ) ;
Result run = session . run ( cql . toString ( ) ) ;
while ( run . hasNext ( ) ) {
Record next = run . next ( ) ;
// log.info(next.toString());
run . next ( ) ;
}
} catch ( Exception e ) {
e. printStackTrace ( ) ;
log. error ( e . getMessage ( ) , e ) ;
}
}
@ -147,7 +145,7 @@ public class Neo4jServiceImpl implements Neo4jService {
Result run = session . run ( "MATCH (n) where id(n) = " + id + Neo4jUtils . NODE_RETURN ) ;
node = Neo4jUtils . getOneNode ( run ) ;
} catch ( Exception e ) {
e. printStackTrace ( ) ;
log. error ( e . getMessage ( ) , e ) ;
}
return node ;
}
@ -157,7 +155,7 @@ public class Neo4jServiceImpl implements Neo4jService {
List < CaseNode > list = new ArrayList < > ( ) ;
try {
Session session = driver . session ( ) ;
StringBu ffer cql = new StringBuff er( ) ;
StringBu ilder cql = new StringBuild er( ) ;
cql . append ( "MATCH (n" ) ;
if ( StringUtils . isNotEmpty ( nodeType ) ) {
cql . append ( ":" ) ;
@ -185,7 +183,7 @@ public class Neo4jServiceImpl implements Neo4jService {
Result run = session . run ( cql . toString ( ) ) ;
list = Neo4jUtils . getNodeList ( run ) ;
} catch ( Exception e ) {
e. printStackTrace ( ) ;
log. error ( e . getMessage ( ) , e ) ;
}
return list ;
}
@ -195,7 +193,7 @@ public class Neo4jServiceImpl implements Neo4jService {
CaseNode node = null ;
try {
Session session = driver . session ( ) ;
StringBu ffer cql = new StringBuff er( ) ;
StringBu ilder cql = new StringBuild er( ) ;
Map < String , Object > params = new HashMap < > ( ) ;
cql . append ( "MATCH (n" ) ;
if ( StringUtils . isNotEmpty ( nodeType ) ) {
@ -223,7 +221,7 @@ public class Neo4jServiceImpl implements Neo4jService {
Result run = session . run ( cql . toString ( ) , params ) ;
node = Neo4jUtils . getOneNode ( run ) ;
} catch ( Exception e ) {
e. printStackTrace ( ) ;
log. error ( e . getMessage ( ) , e ) ;
}
return node ;
}
@ -241,7 +239,7 @@ public class Neo4jServiceImpl implements Neo4jService {
Result run = session . run ( cql , params ) ;
rel = Neo4jUtils . getOneRel ( run ) ;
} catch ( Exception e ) {
e. printStackTrace ( ) ;
log. error ( e . getMessage ( ) , e ) ;
}
if ( rel ! = null & & rel . getId ( ) ! = null ) {
return rel ;
@ -252,7 +250,6 @@ public class Neo4jServiceImpl implements Neo4jService {
@Override
public Rel saveRelation ( Rel rel ) {
Rel res = null ;
try {
Session session = driver . session ( ) ;
Map < String , Object > params = new HashMap < > ( ) ;
@ -264,50 +261,71 @@ public class Neo4jServiceImpl implements Neo4jService {
Result run = session . run ( cql , params ) ;
rel = Neo4jUtils . getOneRel ( run ) ;
} catch ( Exception e ) {
e. printStackTrace ( ) ;
log. error ( e . getMessage ( ) , e ) ;
}
return rel ;
}
@Override
public R < ? > get Node( String picType , String caseId ) {
public R < ? > get CaseGraph( GraphReqVO graphReqVO ) {
Map < String , Object > map = new HashMap < > ( ) ;
List < WebRelDTO > list = new ArrayList < > ( ) ;
List < Map < String , String > > nodes = new ArrayList < > ( ) ;
try {
Session session = driver . session ( ) ;
StringBuilder relQuery = new StringBuilder ( "MATCH (n)-[rel]->(m) " +
"WHERE n.picType = $picType " +
"AND n.caseId = $caseId " ) ;
Map < String , Object > params = new HashMap < > ( ) ;
params . put ( "picType" , picType ) ;
params . put ( "caseId" , caseId ) ;
Result run = session . run ( "MATCH (n)-[rel]->(r) where n.picType = r.picType = $picType and n.caseId = r.caseId = $caseId" +
" RETURN id(rel) as id, n.name as source, id(n) as sourceId, type(rel) as name, r.name as target, id(r) as targetId" , params ) ;
params . put ( "picType" , graphReqVO . getPicType ( ) ) ;
params . put ( "caseId" , graphReqVO . getCaseId ( ) ) ;
if ( StringUtils . isNotEmpty ( graphReqVO . getQueryStr ( ) ) ) {
params . put ( "queryStr" , graphReqVO . getQueryStr ( ) ) ;
relQuery . append ( "AND (n.name CONTAINS $queryStr OR type(rel) CONTAINS $queryStr OR m.name CONTAINS $queryStr) " ) ;
}
if ( graphReqVO . getNodeLabels ( ) ! = null & & ! graphReqVO . getNodeLabels ( ) . isEmpty ( ) ) {
params . put ( "nodeLabels" , graphReqVO . getNodeLabels ( ) ) ;
relQuery . append ( "AND (ANY(label IN $nodeLabels WHERE label IN labels(n)) " +
"OR ANY(label IN $nodeLabels WHERE label IN labels(m))) " ) ;
}
if ( graphReqVO . getRelTypes ( ) ! = null & & ! graphReqVO . getRelTypes ( ) . isEmpty ( ) ) {
params . put ( "relTypes" , graphReqVO . getRelTypes ( ) ) ;
relQuery . append ( "AND ANY(type IN $relTypes WHERE type = type(rel)) " ) ;
}
relQuery . append ( "RETURN id(rel) as id, n.name as source, id(n) as sourceId, n.name as sourceName, type(rel) as relName, m.name as target, id(m) as targetId, m.name as targetName" ) ;
log . info ( "relQuery:{}" , relQuery ) ;
Result run = session . run ( relQuery . toString ( ) , params ) ;
while ( run . hasNext ( ) ) {
Record record = run . next ( ) ;
//long id = record.get("id").asLong();
//String source = record.get("source").asString();
// 组织边
long sourceId = record . get ( "sourceId" ) . asLong ( ) ;
String name = record . get ( "name" ) . asString ( ) ;
//String target = record.get("target").asString();
String relName = record . get ( "relName" ) . asString ( ) ;
long targetId = record . get ( "targetId" ) . asLong ( ) ;
list . add ( new WebRelDTO ( sourceId , targetId , name ) ) ;
}
Result node = session . run ( "MATCH (n) where n.picType = $picType and n.caseId = $caseId RETURN id(n) as id, n.name as name" , params ) ;
while ( node . hasNext ( ) ) {
Record record = node . next ( ) ;
String name = record . get ( "name" ) . asString ( ) ;
long idLong = record . get ( "id" ) . asLong ( ) ;
Map < String , String > nodeMap = new HashMap < > ( ) ;
nodeMap . put ( "name" , name ) ;
nodeMap . put ( "entityName" , name ) ;
nodeMap . put ( "id" , String . valueOf ( idLong ) ) ;
nodes . add ( nodeMap ) ;
list . add ( new WebRelDTO ( sourceId , targetId , relName ) ) ;
// 组织节点
Map < String , String > sourceNodeMap = new HashMap < > ( ) ;
sourceNodeMap . put ( "name" , record . get ( "sourceName" ) . asString ( ) ) ;
sourceNodeMap . put ( "id" , String . valueOf ( sourceId ) ) ;
nodes . add ( sourceNodeMap ) ;
Map < String , String > targetNodeMap = new HashMap < > ( ) ;
targetNodeMap . put ( "name" , record . get ( "targetName" ) . asString ( ) ) ;
targetNodeMap . put ( "id" , String . valueOf ( targetId ) ) ;
nodes . add ( targetNodeMap ) ;
}
} catch ( Exception e ) {
e. printStackTrace ( ) ;
log. error ( "查询失败" , e ) ;
}
// 根据节点ID去重
List < Map < String , String > > distinctNodes = new ArrayList < > ( nodes . stream ( )
. collect ( Collectors . toMap (
node - > node . get ( "id" ) , // 以 ID 为唯一键
node - > node , // 保留整个 Map 作为值
( existing , replacement ) - > existing ) ) // 如果有重复 ID, 保留第一个
. values ( ) ) ;
// 节点和关系合并
Map < String , NodeMapRecord > nodeRecordMap = electNodeRecord ( nodes ) ;
Map < String , NodeMapRecord > nodeRecordMap = electNodeRecord ( disti nctN odes) ;
list = mergerWebRel ( list , nodeRecordMap ) ;
nodes = mergeNode ( nodes , nodeRecordMap ) ;
@ -359,7 +377,7 @@ public class Neo4jServiceImpl implements Neo4jService {
* 推 选 出 代 表 节 点 信 息
*
* @param nodes key : name , entityName , id 节 点 信 息
* @return
* @return key : name , value : NodeMapRecord
* /
private Map < String , NodeMapRecord > electNodeRecord ( List < Map < String , String > > nodes ) {
Map < String , NodeMapRecord > nodeRecordMap = new HashMap < > ( ) ;
@ -385,15 +403,13 @@ public class Neo4jServiceImpl implements Neo4jService {
*
* @param nodes key : name , entityName , id
* @param nodeRecordMap 代 表 节 点 信 息
* @return
* @return 合 并 后 的 节 点 信 息
* /
private List < Map < String , String > > mergeNode ( List < Map < String , String > > nodes , Map < String , NodeMapRecord > nodeRecordMap ) {
return nodes . stream ( ) . map ( map - > {
Map < String , String > nodeMap = new HashMap < > ( ) ;
nodeMap . put ( "name" , map . get ( "name" ) ) ;
nodeMap . put ( "entityName" , map . get ( "entityName" ) ) ;
NodeMapRecord nodeMapRecord = nodeRecordMap . get ( map . get ( "name" ) ) ;
if ( null = = nodeMapRecord ) {
log . warn ( "mergeNode:节点信息异常, nodeRecordMap中不存在节点名称为: {}的NodeMapRecord" , map . get ( "name" ) ) ;
@ -414,7 +430,7 @@ public class Neo4jServiceImpl implements Neo4jService {
*
* @param webRelDTOList 关 系 信 息
* @param nodeRecordMap 代 表 节 点 信 息
* @return
* @return 合 并 后 的 关 系 信 息
* /
private List < WebRelDTO > mergerWebRel ( List < WebRelDTO > webRelDTOList , Map < String , NodeMapRecord > nodeRecordMap ) {