首页>软件资讯>常见问题

常见问题

Neo4j图数据库解析

发布时间:2026-03-06 08:15:31人气:2

1.概念解析


1. Neo4j图数据库基本概念


Node(节点):图数据库中的实体,类似于关系数据库中的记录


Label(标签):给节点分类的一种方式,类似表的概念


Property(属性):存储在节点或关系上的键值对数据


2. 代码中的概念详解


node = Node(name_sentence['entity_type'],            tag=type_sentence,            name=name_sentence['name'],            entity_type=name_sentence['entity_type'],            key=name_sentence['key'])



3. 实际应用示例


下面是一个具体例子,展示如何创建和使用这些节点:


# 假设我们有一个产品知识图谱系统# name_sentence 字典包含实体的信息name_sentence = {    'name': 'ULTRA',           # 实体名称    'entity_type': 'product_name', # 实体类型    'key': 'series_name:ULTRA'  # 键值}

# type_sentence 是实体的标签或分类type_sentence = 'trading'  # 或者 'product', 'parameter' 等

# 创建节点node = Node(name_sentence['entity_type'],      # 节点标签:'product_name'            tag=type_sentence,                 # 属性:'trading'            name=name_sentence['name'],        # 属性:'ULTRA'            entity_type=name_sentence['entity_type'],  # 属性:'product_name'            key=name_sentence['key'])          # 属性:'series_name:ULTRA'

# 此时创建的节点相当于:# CREATE (n:product_name {tag: 'trading', name: 'ULTRA', entity_type: 'product_name', key: 'series_name:ULTRA'})


完整的工作流程


以下是一个完整的示例,展示如何使用这些概念创建知识图谱:


from py2neo import Node, Graph, Relationship, NodeMatcherfrom config import BASE_IP

class Neo4jQuery(object):    def __init__(self):        # 连接到Neo4j数据库        link = Graph(f"bolt://{BASE_IP}:7687", auth=("neo4j", "12345678"))        self.graph = link

    def create_node(self, type_node, name_node):        """创建节点的完整流程"""        nodes = []

        # 遍历输入的数据,批量创建节点        for name_sentence, type_sentence in zip(name_node, type_node):             # 创建节点,第一个参数是标签,后续参数是节点属性            node = Node(name_sentence['entity_type'],  # 设置节点标签                        tag=type_sentence,              # 设置tag属性                        name=name_sentence['name'],     # 设置name属性                        entity_type=name_sentence['entity_type'],  # 设置entity_type属性                        key=name_sentence['key'])       # 设置key属性

            # 检查节点是否已存在            matcher.match(name=name_sentence['name'],                              tag=type_sentence,                              entity_type=name_sentence['entity_type'],                              key=name_sentence['key']))

           if len(nodelist) > 0:  # 节点已存在,不创建新节点                node = nodelist[0]            else:                self.graph.create(node)  # 节点不存在,创建新节点

            nodes.append(node)

        print('节点建立成功')        return nodes

# 示例数据type_nodes = ['product', 'trading', 'parameter']  # 类型句子列name_nodes = [    {        'name': 'X3-ULTRA',           # 名称        'entity_type': 'product_name', # 实体类型        'key': 'series_name:X3-ULTRA'  # 键值    },    {        'name': 'annual trading',      # 名称        'entity_type': 'trade_type',   # 实体类型        'key': 'trade_type:annual'    },            {        'name': 'rated power',         # 名称        'entity_type': 'parameter',    # 实体类型        'key': 'param:rated_power'     # 键值    }]

# 使用示例spo = Neo4jQuery()created_nodes = spo.create_node(type_nodes, name_nodes)


核心概念总结




标签(Label):name_sentence['entity_type'],是节点的分类标识,在Cypher查询中用冒号前缀表示(如:product_name)


类型句子(type_sentence):作为节点的tag属性,提供额外的分类信息


名称(name):节点的name属性,通常是实体的主要标识


实体类型(entity_type):描述实体的类型,用于在查询时区分不同类型的节点


键值(key):用于唯一标识或查找节点的键值


name_sentence字典:包含实体各种属性信息的数据结构,包括名称、实体类型和键值


这种设计允许构建复杂的关系网络,其中每个节点都有明确的类型和标识,并且可以通过多种属性进行查询和匹配,避免重复创建相同的节点。




上一条:Grafana入门

下一条:简单快速入手Neo4j