1.简介
Total Neighbors 根据节点拥有的唯一邻居的数量计算节点的接近度。它基于节点连接越多,接收新链接的可能性就越大的想法
算法公式如下:
其中N(x)为节点x的关系节点,N(y)为节点y相邻节点。
值0表示两个节点不接近,而较高的值表示节点较近。
neo4j包含一个函数来计算两个节点之间的接近度
2.使用场景
3.源码解析
public double totalNeighbors(@Name("node1") Node node1, @Name("node2") Node node2,
@Name(value = "config", defaultValue = "{}") Map<String, Object> config) {
ProcedureConfiguration configuration = ProcedureConfiguration.create(config);
RelationshipType relationshipType = configuration.getRelationship();
Direction direction = configuration.getDirection(Direction.BOTH);
NeighborsFinder neighborsFinder = new NeighborsFinder(api);
return neighborsFinder.findNeighbors(node1, node2, relationshipType, direction).size();
}
入参:node1,node2为两个节点数据,config中能识别relationshipQuery和direction,其中relationshipQuery为节点关系编码,direction为方向,默认为BOTH无方向,OUTING为node1->node2,INCOMING为node2->node1。
源码解析:
1.将传入的config参数放入ProcedureConfiguration的config中
ProcedureConfiguration configuration = ProcedureConfiguration.create(config);
2.获取ProcedureConfiguration类config中relationshipQuery参数(此参数为关系名称)
RelationshipType relationshipType = configuration.getRelationship();
3.获取config中direction参数,此为指定关系方向
Direction direction = configuration.getDirection(Direction.BOTH);
4.获取两个节点所有相邻节点并集的数量
neighborsFinder.findNeighbors(node1, node2, relationshipType, direction).size();
4.neo4j中资源分配算法使用示例
1)数据初始化
MERGE (zhen:Person {name: "Zhen"})
MERGE (praveena:Person {name: "Praveena"})
MERGE (michael:Person {name: "Michael"})
MERGE (arya:Person {name: "Arya"})
MERGE (karin:Person {name: "Karin"})
MERGE (zhen)-[:FRIENDS]-(arya)
MERGE (zhen)-[:FRIENDS]-(praveena)
MERGE (praveena)-[:WORKS_WITH]-(karin)
MERGE (praveena)-[:FRIENDS]-(michael)
MERGE (michael)-[:WORKS_WITH]-(karin)
MERGE (arya)-[:FRIENDS]-(karin)
2)以下将返回 Michael 和 Karin 的 Total Neighbors 全邻域数
MATCH (p1:Person {name: 'Michael'})
MATCH (p2:Person {name: 'Karin'})
RETURN algo.linkprediction.totalNeighbors(p1, p2) AS score
结果:4.0
3)我们还可以根据特定的关系类型计算一对节点的全邻域数.以下将仅根据FRIENDS
关系返回 Michael 和 Karin 的全邻域数
MATCH (p1:Person {name: 'Michael'})
MATCH (p2:Person {name: 'Karin'})
RETURN algo.linkprediction.totalNeighbors(p1, p2, {relationshipQuery: "FRIENDS"}) AS score
结果:2.0