关系查找实现

对于查找的两节点应存在通路,节点的关系如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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值