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