当前位置:   article > 正文

NEO4J-链路预测算法02-公共邻居算法(commonNeighbors)应用场景简介(抖音朋友推荐)_共同邻居算法代码怎么写

共同邻居算法代码怎么写

说明:使用neo4j算法库时需引入跟neo4j数据库对应的算法库插件或自定义算法库

 

1.简介

        公共邻居捕捉到两个共同朋友比没有任何共同朋友的陌生人更有可能被介绍的想法。

        它使用如下公式进行计算的:CN(x,y)=|N(x)\cap N(y)|,其中N(x)是与节点x相邻的节点集,N(y)是与y节点相邻的节点集,PA(x,y)即为计算x和y节点的共同节点

值0表示两个节点不接近,而较高的值表示节点相近。

2.使用场景

        进入抖音app,常常会弹出一个框,可能认识,上面显示显示由多少个共同朋友,即使用公共邻居算法。

        neo4j算法库中提供了algo.linkprediction.commonNeighbors函数

3.源码解析

公共邻居算法源码实现如下:

  1. public double commonNeighbors(@Name("node1") Node node1, @Name("node2") Node node2,
  2. @Name(value = "config", defaultValue = "{}") Map<String, Object> config) {
  3. if (node1 == null || node2 == null) {
  4. throw new RuntimeException("Nodes must not be null");
  5. }
  6. ProcedureConfiguration configuration = ProcedureConfiguration.create(config);
  7. RelationshipType relationshipType = configuration.getRelationship();
  8. Direction direction = configuration.getDirection(Direction.BOTH);
  9. Set<Node> neighbors = new NeighborsFinder(api).findCommonNeighbors(node1, node2, relationshipType, direction);
  10. return neighbors.size();
  11. }

        入参:node1,node2为两个节点数据,不能为空,config为条件参数,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.条件返回节点1的关系节点,并且过滤掉与节点2没有关系的节点(即取节点1和节点2同时有relationshipType关系的且方向为direction的节点)

Set<Node> neighbors = new NeighborsFinder(api).findCommonNeighbors(node1, node2, relationshipType, direction);

5.返回4中集合大小

由源码可知调用格式如下:

  1. RETURN algo.linkprediction.commonNeighbors(node1:Node, node2:Node, {
  2. relationshipQuery: null,
  3. direction: "BOTH"
  4. })

4.neo4j中公共邻居算法使用示例

1.数据初始化

  1. MERGE (zhen:Person {name: "李俊亮"})
  2. MERGE (praveena:Person {name: "张学友"})
  3. MERGE (michael:Person {name: "王槮"})
  4. MERGE (arya:Person {name: "王桃"})
  5. MERGE (karin:Person {name: "古巨基"})
  6. MERGE (zhen)-[:FRIENDS]-(arya)
  7. MERGE (zhen)-[:FRIENDS]-(praveena)
  8. MERGE (praveena)-[:WORKS_WITH]-(karin)
  9. MERGE (praveena)-[:FRIENDS]-(michael)
  10. MERGE (michael)-[:WORKS_WITH]-(karin)
  11. MERGE (arya)-[:FRIENDS]-(karin)

2.以下将返回李俊亮和古巨基的共同邻居数

  1. MATCH (p1:Person {name: '古巨基'})
  2. MATCH (p2:Person {name: '李俊亮'})
  3. RETURN algo.linkprediction.commonNeighbors(p1, p2) AS score

结果:2.0

3.以下将返回李俊亮和王槮共同邻居数

  1. MATCH (p1:Person {name: '李俊亮'})
  2. MATCH (p2:Person {name: '王槮'})
  3. RETURN algo.linkprediction.commonNeighbors(p1, p2, {relationshipQuery: "FRIENDS"}) AS score

结果:1.0

上一篇:NEO4J-链路预测算法01-Adamic Adac算法(adamicAdar)应用场景简介

下一篇:NEO4J-链路预测算法03-优先链接算法(Preferential Attachment)应用场景简介

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号