知识图谱 | 语义网络写入图形数据库(含jdk和neo4j的安装过程)

Hi,大家好,我是半亩花海。本文主要介绍如何使用 Neo4j 图数据库呈现语义网络,并通过 Python 将语义网络的数据写入数据库。具体步骤包括识别知识中的节点和关系,将其转化为图数据库的节点和边,最后通过代码实现数据的写入和展示。


目录

一、实验目的

二、实验要求

三、实验原理

四、实验步骤

1. 环境配置

(1)下载 JDK

(2)安装 neo4j

(3)配置环境变量

(4)启动 neo4j

2. 安装 py2neo 库

3. 从 py2neo 包导入库

4. 连接 Neo4j 图形数据库

5. 创建并覆盖节点

6. 创建关系

7. 将关系应用到图中

五、实验结果

六、实验小结

七、完整代码


一、实验目的

(1)了解向数据库中写入语义网络的方法。

(2)简单使用Neo4j呈现语义网络。


二、实验要求

本次实验后,能理解语义网络的节点(Node)和关系(Relationship)在数据库中是如何呈现的。


三、实验原理

按照5.3节《知识的语义网络表示》介绍的方法(5.3.1-事实性知识的表示,5.3.2-情况、动作和事件的表示,5.3.3-连词和量词的表示,5.3.4-用语义网络表示知识的步骤),将一个事实用语义网络表示,首先要找出它的节点,再描述它与其他节点的关系,最后用 Python 写入数据库中。


四、实验步骤

1. 环境配置

(1)下载 JDK

官网下载链接:Java Downloads | Oracle

JDK版本的选择一定要恰当,这里我下载安装的是jdk11。Jdk的版本很重要,需要与neo4j匹配适应,版本太低或太高都可能导致后续的neo4j无法使用。

可以参考CSDN上的经验贴,比如借鉴以下这个博主的经验:Neo4j安装教程及版本匹配_neo4j5.15对应哪个版本jdk-CSDN博客Neo4j安装教程及版本匹配_neo4j5.15对应哪个版本jdk-CSDN博客)。

(2)安装 neo4j

安装好JDK之后,便可以安装neo4j。

官方下载链接:Neo4j Deployment Center - Graph Database & Analytics

根据上述jdk对应版本来看,这里我下载安装的是neo4j 4.4.33

(3)配置环境变量

安装好 JDK 和 neo4j 之后就要开始配置环境变量。步骤如下:右键单击此电脑→属性→高级系统设置→高级→环境变量,着眼于在下方的系统变量区域。

  • 新建第一个环境变量,变量名为JAVA_HOME,变量值是jdk的文件路径,这里我是E:\jdk\jdk-11.0.23_windows-x64_bin\jdk-11.0.23。
  • 新建第二个环境变量,变量名为NEO4J_HOME,变量值是neo4j的文件路径,这里我是E:\neo4j\neo4j-community-4.4.33-windows\neo4j-community-4.4.33。
  • 编辑Path新建→输入 %JAVA_HOME%\bin 和 %NEO4J_HOME%\bin

(4)启动 neo4j

管理员身份运行 cmd。在命令行处输入neo4j.bat console。

如出现此界面,则证明neo4j启动成功。在浏览器中输入上述界面中给出的网址http://localhost:7474/,则会显示如下界面。

默认的用户名和密码均为neo4j。但是可以修改密码,记住这个密码,后续代码会用到。随后cmd也会出现上述结果。至此,neo4j安装完毕

2. 安装 py2neo 库

在cmd中输入以下命令即可:pip install py2neo。

3. 从 py2neo 包导入库

from py2neo import Graph, Node, Relationship

4. 连接 Neo4j 图形数据库

# 连接Neo4j图形数据库
g = Graph('http://localhost:7474', user='neo4j', password='0123456789', name='neo4j')

此处,密码我修改为0123456789,进入neo4j。

5. 创建并覆盖节点

植物、树、草、叶、根、水草、水、果树、结果、梨树、结梨这些节点类继承自StructuredNode类,包括节点属性和连接关系。

即将要构造的事实为“树和草都是植物。树和草都有叶和根。水草是草,且生长水中。果树是树,且会结果。梨树是果树的一种,它会结梨”。

# 删除数据库中的所有节点和关系
g.delete_all()

# 创建节点
test_node_1 = Node("植物", name="植物")
test_node_2 = Node("根", name="根")
test_node_3 = Node("叶", name="叶")
test_node_4 = Node("草", name="草")
test_node_5 = Node("水草", name="水草")
test_node_6 = Node("水中", name="水中")
test_node_7 = Node("树", name="树")
test_node_8 = Node("果树", name="果树")
test_node_9 = Node("结果", name="结果")
test_node_10 = Node("梨树", name="梨树")
test_node_11 = Node("结梨", name="结梨")

# 覆盖创建节点
g.merge(test_node_1, "植物", "name")
g.merge(test_node_2, "根", "name")
g.merge(test_node_3, "叶", "name")
g.merge(test_node_4, "草", "name")
g.merge(test_node_5, "水草", "name")
g.merge(test_node_6, "水中", "name")
g.merge(test_node_7, "树", "name")
g.merge(test_node_8, "果树", "name")
g.merge(test_node_9, "结果", "name")
g.merge(test_node_10, "梨树", "name")
g.merge(test_node_11, "结梨", "name")

6. 创建关系

# 创建关系
relation1 = Relationship(test_node_1, 'Have', test_node_2)
relation2 = Relationship(test_node_1, 'Have', test_node_3)
relation3 = Relationship(test_node_4, 'AKO', test_node_1)
relation4 = Relationship(test_node_5, 'AKO', test_node_4)
relation5 = Relationship(test_node_5, 'Live', test_node_6)
relation6 = Relationship(test_node_7, 'AKO', test_node_1)
relation7 = Relationship(test_node_8, 'AKO', test_node_7)
relation8 = Relationship(test_node_8, 'Can', test_node_9)
relation9 = Relationship(test_node_10, 'ISA', test_node_8)
relation10 = Relationship(test_node_11, 'Can', test_node_10)

7. 将关系应用到图中

# 将关系应用到图中
g.merge(relation1)
g.merge(relation2)
g.merge(relation3)
g.merge(relation4)
g.merge(relation5)
g.merge(relation6)
g.merge(relation7)
g.merge(relation8)
g.merge(relation9)
g.merge(relation10)

五、实验结果


六、实验小结

  1. jdkneo4j的版本需要匹配,这里我用的是 jdk11和neo4j 4.4.33,其中任何一个版本过高或过低都会导致安装库之后运行错误。
  2. 配置环境变量的时候,需要注意两个变量命名和路径的正确性。
  3. 创建节点和关系的时候需要反复注意各变量之间逻辑关系。

七、完整代码

# 从neomodel包导入类从neomodel包导入类
from neomodel import StructuredNode, StringProperty, RelationshipTo, RelationshipFrom, config

# 连接Neo4j图形数据库
config.DATABASE_URL = 'bolt://meo4j:neo4j@localhost:7687'


# 编写节点类
# 植物、树、草、叶、根、水草、水、果树、结果、梨树、结梨这些节点类继承自StructuredNode类,包括节点属性和连接关系。
class Plant(StructuredNode):
    name = StringProperty(unique_index=True)
    has1 = RelationshipFrom('Tree', 'AKO')
    has2 = RelationshipFrom('Grass', 'AKO')
    havel = RelationshipTo('Leaf', 'Have')
    have2 = RelationshipTo('Root', 'Have')


class Tree(StructuredNode):
    name = StringProperty(unique_index=True)
    ako = RelationshipTo('Plant', 'AKO')
    have = RelationshipFrom('Fruiter', 'AKO')


class Grass(StructuredNode):
    name = StringProperty(unique_index=True)
    ako = RelationshipTo('Plant', 'AKO')
    have = RelationshipFrom('Waterweeds', 'AKO')


class Leaf(StructuredNode):
    name = StringProperty(unique_index=True)
    have = RelationshipFrom('Plant', 'AKO')


class Root(StructuredNode):
    name = StringProperty(unique_index=True)
    have = RelationshipFrom('Plant', 'Have')


class Waterweeds(StructuredNode):
    name = StringProperty(unique_index=True)
    ako = RelationshipTo('Grass', 'AKO')
    live = RelationshipTo('Water', 'AKO')


class Water(StructuredNode):
    name = StringProperty(unique_index=True)
    have = RelationshipFrom('Waterweeds', 'Live')


class Fruiter(StructuredNode):
    name = StringProperty(unique_index=True)
    ako = RelationshipTo('Tree', 'AKO')
    can = RelationshipTo('Bear', 'Can')
    have = RelationshipFrom('Pear', 'AKO')


class Bear(StructuredNode):
    name = StringProperty(unique_index=True)
    have = RelationshipFrom('Fruiter', 'Can')


class Pear(StructuredNode):
    name = StringProperty(unique_index=True)
    ako = RelationshipTo('Fruiter', 'AKO')
    can = RelationshipTo('BearPear', 'Can')


class BearPear(StructuredNode):
    name = StringProperty(unique_index=True)
    have = RelationshipFrom('Pear', 'Can')


# 根据类生成实例
plant = Plant(name="植物").save()
tree = Tree(name="树").save()
grass = Grass(name="草").save()
leaf = Leaf(name="叶").save()
root = Root(name="根").save()
waterweeds = Waterweeds(name="水草").save()
water = Water(name="水").save()
fruiter = Fruiter(name="果树").save()
bear = Bear(name="结果").save()
pear = Pear(name="梨树").save()
bearpear = BearPear(name="结梨").save()


# 创建实例之间的连接关系
pear.ako.connect(fruiter)
pear.can.connect(bearpear)
fruiter.ako.connect(tree)
fruiter.can.connect(bear)
waterweeds.ako.connect(grass)
waterweeds.live.connect(water)
plant.havel.connect(leaf)
plant.have2.connect(root)
tree.ako.connect(plant)
grass.ako.connect(plant)
  • 10
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值