[Py2neo]统计Neo4j中图谱类别与类别之间的链接频次

这是一个程序,可以统计图谱中不同类别之间互相链接的频次,简而言之就是,图谱中存在着很多结点,结点都属于它们各自的类别,我们通过深度遍历整个图谱,将类别与类别之间的频次统计出来,最后的结果是一个dict,它的键值是每一种类别,结果示意如下:

{
    'label': {
        'in': {
            'label_?': 0
        }
        'out': {
            'label_?': 123
        }
     }
}

in 和 out 代表的是入边和出边,完整的程序如下所示:

def freq_of_labels(graph, matcher):
    label_link_count = {} # 初始化标签链接频次字典
    visited = set() # 初始化已访问节点集合

    # 定义遍历函数
    def traverse(graph, node, depth):
        '''深度优先遍历'''
        
        # 检查节点是否已被访问过
        if node not in visited:
            visited.add(node)

            # 寻找当前节点的所有关系
            relationships = graph.match((matcher.get(node), None), r_type=None)

            # 获取节点标签(目前不考虑多标签)
            node = graph.nodes.get(node)
            label = list(node.labels)[0]
            
            # 遍历节点的所有关系
            for rel in relationships:
                
                # 获取关系的终点节点和终点节点的标签
                end_node = rel.end_node
                end_label = list(end_node.labels)[0]
                rel_name = list(rel.types())[0]
                
                # 更新标签链接频次字典(出边)
                if not label_link_count.get(label):
                    label_link_count[label] = {"in": {}, "out": {}}
                if not label_link_count[label]["out"].get(rel_name):
                    label_link_count[label]['out'][rel_name] = {}
                if not label_link_count[label]["out"][rel_name].get(end_label):
                    label_link_count[label]["out"][rel_name][end_label] = 0
                label_link_count[label]["out"][rel_name][end_label] += 1
                    
                # 更新标签链接频次字典(入边)
                if not label_link_count.get(end_label):
                    label_link_count[end_label] = {"in": {}, "out": {}}
                if not label_link_count[label]["in"].get(rel_name):
                    label_link_count[end_label]['in'][rel_name] = {}    
                if not label_link_count[end_label]["in"][rel_name].get(label):
                    label_link_count[end_label]["in"][rel_name][label] = 0
                label_link_count[end_label]["in"][rel_name][label] += 1

                # 递归遍历终点节点
                if depth > 0:
                    traverse(graph, end_node.identity, depth-1)

    # 遍历整个图谱
    for node in graph.nodes:
        traverse(graph, node, depth=3)

    # 返回节点标签链接频次字典
    return label_link_count

这里的matcher指的是NodeMatcher:

from py2neo import Graph, NodeMatcher
graph = Graph('http://localhost:7474', auth=('neo4j', 'neo4j'))
matcher = NodeMatcher(graph)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Jiawen9

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

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

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

打赏作者

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

抵扣说明:

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

余额充值