对于查找的两节点应存在通路,节点的关系如a-b,a-c,b-d,d-e,d-c的示例,具体实现如下:
/**
* 获取相关节点* @param nodename
* @param querynodes
* @return
*/
public List<Map<String, Object>> getRelationLink(String nodename, List<String> querynodes) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
List<Map<String, Object>> nodeRelation = DataConfig.tableRelation;
if (nodeRelation.isEmpty()) {
log.error("******************** 关系不存在!!! *********************");
return result;
}
// 查找节点的直接关系链
String[] fieldtable = new String[]{ "node1", "node2" };
List<Map<String, Object>> startLinks = getDirectRelationLink(nodename, fieldtable, nodeRelation);
if (startLinks.isEmpty()) {
log.error("******************** 关系配置信息有误:" + nodename + "节点关系不存在!!! *********************");
return result;
}
// 获取节点关系链
for (String querynode : querynodes) {
result.addAll(funRelationLinks(nodename, querynode, fieldtable, startLinks));
}
// 整合链条数据,保证每条链的唯一性
result = rmRepetitionTableRelation(result, fieldtable);
return result;
}
/**
* 查询关系节点
* @param nodename
* @param querynode
* @param fieldtable
* @param nodeRelation
* @return
*/
public List<Map<String, Object>> funRelationLinks(String nodename, String querynode, String[] fieldtable,
List<Map<String, Object>> nodeRelation) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
List<String> rmtname = new ArrayList<String>();
rmtname.add(nodename);
// 获取表关系链
List<Map<String, Object>> relationlink = funRelationLink(
nodename,
querynode,
fieldtable,
nodeRelation,
DataStatisticsConstant.LINK_CNT_INIT,
rmtname);
if (CommonUtil.isEmpty(relationlink) || relationlink.isEmpty()) {
log.error("******************节点关系未找到:原因是节点关系不存在或者查找路径设置过短!!!*******************");
return result;
}
String nodenamelink = classifyByField(relationlink.get(0), fieldtable[0], fieldtable[1], querynode);
result.add(relationlink.get(0));
if (nodename.equals(nodenamelink)) {
// 获取到与起点nodename的关系链
return result;
}
// 未获取到与起点nodename的关系链
nodeRelation = getDirectRelationLink(nodename, fieldtable, DataConfig.tableRelation);
result.addAll(funRelationLinks(nodename, nodenamelink, fieldtable, nodeRelation));
return result;
}
/**
* 查询关系节点
* @param nodename
* @param querynode
* @param fieldtable
* @param nodeRelation
* @param cnt
* @param rmtname
* @return
*/
public List<Map<String, Object>> funRelationLink(String nodename, String querynode, String[] fieldtable,
List<Map<String, Object>> nodeRelation, int cnt, List<String> rmtname) {
List<Map<String, Object>> result = new ArrayList<Map<String, Object>>();
List<Map<String, Object>> nodeConditionLink = getDirectRelationLink(querynode, fieldtable, nodeRelation);
if (!nodeConditionLink.isEmpty()) {
// 两节点存在直接关系链:仅存在一条
result.addAll(nodeConditionLink);
return result;
}
rmtname.add(nodename);
cnt++;
// 查找链数
if (cnt == DataStatisticsConstant.LINK_CNT_MAX) {
return result;
}
// 两节点不存在直接关系
// 获取nodename相关节点
List<String> querynodes = rmRepetitionValue(classifyByField(nodeRelation, fieldtable[0], fieldtable[1], nodename), rmtname);
querynodes.remove(nodename);
for (String ofnode : querynodes) {
result = funRelationLink(
ofnode,
querynode,
fieldtable,
getDirectRelationLink(ofnode, fieldtable, DataConfig.tableRelation),
cnt,
rmtname);
// 得到关联节点
if (!result.isEmpty()) {
break;
}
}
return result;
}