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

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

 

1.简介

Adamic Adac算法公式如下:A(x,y) = \sum_{u\epsilon N(x)\cap N(y) }^{}\frac{1}{log|N(u)|}

其中N(u)是与相邻的节点集u。

值A(x,y)=0表示两个节点不接近,而较高的值表示节点较近

该库包含一个计算两个节点之间接近都的函数

2.语法示例及使用场景

语法:

RETURN gds.alpha.linkprediction.adamicAdar(node1:Node, node2:Node, {
    relationshipQuery:String,
    direction:String
})
参数类型默认可选说明
node1节点null节点
node2节点null另一个节点
relationshipQuery字符串null是的用于计算node1和之间相似度的关系类型node2
direction字符串两者是的用于计算node1和之间相似度的关系方向node2。可能的值为OUTGOINGINCOMINGBOTH

Adamic Adac算法常用于社交链路中关系的预测,如好友推荐,美食推荐等等,目前国内社交市场火爆的抖音中就有好友推荐或者视频推荐,学习此算法后可以实现此功能

3.neo4j中Adamic Adac算法使用示例

1.初始化数据

CREATE
 (zhen:Person {name: 'Zhen'}),
 (praveena:Person {name: 'Praveena'}),
 (michael:Person {name: 'Michael'}),
 (arya:Person {name: 'Arya'}),
 (karin:Person {name: 'Karin'}),

 (zhen)-[:FRIENDS]->(arya),
 (zhen)-[:FRIENDS]->(praveena),
 (praveena)-[:WORKS_WITH]->(karin),
 (praveena)-[:FRIENDS]->(michael),
 (michael)-[:WORKS_WITH]->(karin),
 (arya)-[:FRIENDS]->(karin)

2.预测Michael和Karin的Adamic Adar分数

MATCH (p1:Person {name: 'Michael'})
MATCH (p2:Person {name: 'Karin'})
RETURN algo.linkprediction.adamicAdar(p1, p2) AS score

结果:0.9102392266268373

3.我们还可以根据特定关系类型计算一对节点的分数

MATCH (p1:Person {name: 'Michael'})
MATCH (p2:Person {name: 'Karin'})
RETURN algo.linkprediction.adamicAdar(p1, p2, {relationshipQuery: 'FRIENDS'}) AS score

结果:0.0

4.源码解析

public double adamicAdarSimilarity(@Name("node1") Node node1, @Name("node2") Node node2,
                                       @Name(value = "config", defaultValue = "{}") Map<String, Object> config) {
        if (node1 == null || node2 == null) {
            throw new RuntimeException("Nodes must not be null");
        }
        ProcedureConfiguration configuration = ProcedureConfiguration.create(config);
        RelationshipType relationshipType = configuration.getRelationship();
        Direction direction = configuration.getDirection(Direction.BOTH);

        Set<Node> neighbors = new NeighborsFinder(api).findCommonNeighbors(node1, node2, relationshipType, direction);
        return neighbors.stream().mapToDouble(nb -> 1.0 / Math.log(degree(nb, relationshipType, direction))).sum();
    }

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/对数值Math.log(result),在此基础上再求和,得到分数值

由上源码可知:

  • 使用此函数时,node1和node2不能为空
  • config中可传入参数relationshipQuery和direction

下一篇:NEO4J-链路预测算法02-公共邻居算法(adamicAdar)应用场景简介(抖音朋友推荐)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疯狂攻城师

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值