NEO4J创建具有上下位关系的分类体系节点

NEO4J递归创建概念体系

在neo4j的命令行批量创建节点和关系困难,本文利用py2neo和递归算法实现批量创建具有上下位关系的分类体系节点。

数据源准备

为了表现层级关系,使用多层的字典结构。没有下层节点时,value为空字典。

{
    "l1": {
		"l11": {},
		"l12": {}
	},
	"l2": {
		"l21": {},
		"l22": {},
		"l23": {},
		"l24": {}
	}
}

代码实现

from py2neo import Graph, NodeMatcher, Subgraph, Relationship, Node
# 链接图数据库,创建节点匹配器
g = Graph("http://localhost:7474/browser/", user="neo4j", password="***")

def label_create(labelfile, relations):
    """
    将标签概念存入图数据库
    :param labelfile: 保存标签概念的字典
    :param relations: 暂存关系的数组
    :return: 当前层节点集合;关系集合
    """
    Nodes = []
    for k1, v1 in labelfile.items():
        if '_' in k1:
            name = k1.split('_')[0]
            code = k1.split('_')[1]
            conceptNode1 = Node("concept", name=name, code=code)
            g.create(conceptNode1)
        else:
            name = k1
            conceptNode1 = Node("concept", name=name)
            g.create(conceptNode1)
        Nodes.append(conceptNode1)
        if v1:
            nnn, _ = label_create(v1, relations)  # 递归获取下级节点集合
            for n in nnn:
                rel = Relationship(n, 'SubClassOf', conceptNode1)
                relations.append(rel)
    return Nodes, relations

# 建立标签节点及关系
with open(self.labelpath, 'r', encoding='utf-8') as load_f:
    labelfile = json.load(load_f)
relations = []
_, rrr = label_create(labelfile, relations)
sss = Subgraph(relationships=relations)
g.create(sss)
posted @ 2021-04-14 17:18  gqhoshino  阅读(436)  评论(0)    收藏  举报