跳到主要内容
基于 Protege 与 Neo4j 的教育领域知识图谱构建及前端可视化 | 极客日志
Python AI 大前端 java 算法
基于 Protege 与 Neo4j 的教育领域知识图谱构建及前端可视化 综述由AI生成 基于 Protege 和 Neo4j 构建教育领域知识图谱的完整流程。内容包括工具安装、OWL 转 Turtle 格式、RDF 数据导入 Neo4j、使用 APOC 库导出 JSON、利用 Python 脚本转换数据格式以适配 Echarts,最后通过 Vue 实现前端可视化。重点解决了 JDK 版本切换、文件转化失败及数据清洗等常见问题。
DevOpsTeam 发布于 2026/4/6 更新于 2026/5/24 38 浏览1、工具下载
1.1 Protege 的安装
版本说明:Protégé-5.5.0
了解其基本使用。
1.2 Neo4j 的安装
2、Neo4j 导入 Protege 文件
2.1 启动 Neo4j
版本:JDK11
Win+R 输入 cmd,执行以下命令:
neo4j.bat console
2.2 Protege 导出 OWL 文件转 Turtle 文件
在配置 Protege 生成 Turtle 文件时,若遇到无法生成或文件为 0KB 的情况,需检查 JDK 版本。Neo4j 启动与 Protege 转换可能依赖不同版本的 Java。
JDK 版本切换:
从官网下载所需的两个 Java 版本,分别配置系统变量。主要通过修改 JAVA_HOME 变量的值来实现切换(例如 %JDK1.8% 或 %JDK11%)。
转换指令:
在包含 OWL 文件的文件夹中,Shift + 鼠标右键打开 PowerShell,输入以下指令(替换源文件和输出文件名):
java -jar rdf2rdf-1.0.1-2.3.1.jar creature.owl creature.turtle
转换完成后,检查文件大小是否大于 0KB。
2.3 导入 Neo4j
1. 清除数据库中的所有数据 MATCH (n) DETACH DELETE n;
2. 初始化 RDF 导入配置 CALL n10s.graphconfig.init();
3. 导入 RDF 数据 CALL n10s.rdf.import.fetch("file:///E:/BaiduNetdiskDownload/owl 导入 neo4j/第一单元_test.turtle", "RDF/XML", {handleVocabUris: "IGNORE"})
4. 查询所有(部分)数据 MATCH (n) WHERE n:`节点名称 1` OR n:`节点名称 2` OR n:`节点名称 3` RETURN n LIMIT 500;
5. 查询边关系 MATCH ()-[r]->() RETURN DISTINCT type(r) AS relationshipType
6. 一些细节 节点信息的 URI 通常有很长的前缀,可使用以下指令清理:
MATCH (n) SET n.uri = REPLACE(n.uri, 'http://www.semanticweb.org/florence/ontologies/2025/1/untitled-ontology-9#', '') RETURN n
3、Neo4j 导出 JSON 文件 导出 JSON 的目的是方便后续利用 Echarts 进行可视化。需要借助 APOC 库 。请先下载并安装 APOC 库。
CALL apoc.export.json.query(
"MATCH (n) WHERE n:`节点名称 1` OR n:`节点名称 2` OR n:`节点名称 3` OPTIONAL MATCH (n)-[r]->(m) RETURN n, r, m LIMIT 500",
"file:///E:/neo4j/neo4j-community-4.4.41/import/output_3.0.json",
{format: 'PLAIN'}
)
第一行:查询所有节点 + 匹配关系 + 返回所有信息。
第二行:导出文件路径及文件名称。
第三行:指定导出的格式为 PLAIN,即简单的 JSON 格式。
至此,原始数据已获取。下面将进行数据处理,然后利用 Echarts 和 Vue 实现前端可视化。
4、可视化前的操作
4.1 利用 Python 对数据进行处理 从 Neo4j 导出的 JSON 文件并不符合 Echarts 的数据格式,需要利用 Python 进行处理。
{
"n" : {
"type" : "node" ,
"id" : "2" ,
"labels" : [ "Resource" , "课名称" , "owl__NamedIndividual" ] ,
"properties" : {
"描述" : "算法的多分支结构,判断闰年的规则" ,
"编号" : 3.3 ,
"名称" : "闰年平年我知道(1)"
}
} ,
"r" : {
"id" : "69" ,
"type" : "relationship" ,
"label" : "父子" ,
"start" : { "id" : "2" } ,
"end" : { "id" : "101" }
} ,
"m" : ...
}
import json
def convert_to_echarts_data (file_path ):
with open (file_path, 'r' , encoding='utf-8' ) as f:
neo4j_data = json.load(f)
echarts_data = {"nodes" : [], "links" : []}
node_map = {}
for item in neo4j_data:
node = item.get("n" , None )
if node:
node_id = node.get("id" )
node_labels = node.get("labels" , [])
node_properties = node.get("properties" , {})
node_name = node_properties.get("名称" , node_properties.get("name" , node_id))
node_uri = node_properties.get("uri" , node_id)
if node_id not in node_map:
echarts_node = {
"id" : node_id,
"name" : node_name,
"category" : node_labels[1 ] if len (node_labels) > 1 else "其他" ,
"value" : node_uri,
"properties" : node_properties
}
echarts_data["nodes" ].append(echarts_node)
node_map[node_id] = echarts_node
m_node = item.get("m" , None )
if m_node:
node_id = m_node.get("id" )
node_labels = m_node.get("labels" , [])
node_properties = m_node.get("properties" , {})
node_name = node_properties.get("名称" , node_properties.get("name" , node_id))
node_uri = node_properties.get("uri" , node_id)
if node_id not in node_map:
echarts_node = {
"id" : node_id,
"name" : node_name,
"category" : node_labels[1 ] if len (node_labels) > 1 else "其他" ,
"value" : node_uri,
"properties" : node_properties
}
echarts_data["nodes" ].append(echarts_node)
node_map[node_id] = echarts_node
for item in neo4j_data:
relationship = item.get("r" , None )
if relationship:
start_node = relationship.get("start" )
end_node = relationship.get("end" )
start_id = start_node.get("id" )
end_id = end_node.get("id" )
relationship_label = relationship.get("label" )
echarts_link = {
"source" : start_id,
"target" : end_id,
"value" : relationship_label,
}
echarts_data["links" ].append(echarts_link)
return echarts_data
if __name__ == "__main__" :
input_file = r"E:\neo4j\neo4j-community-4.4.41\import\output_4.0.json"
output_file = "converted_data2.0.json"
echarts_data = convert_to_echarts_data(input_file)
with open (output_file, 'w' , encoding='utf-8' ) as f:
json.dump(echarts_data, f, ensure_ascii=False , indent=4 )
print (f"数据已成功转换并保存到 {output_file} " )
{
"nodes" : [
{
"id" : "2" ,
"name" : "闰年平年我知道(1)" ,
"category" : "课名称" ,
"value" : "闰年平年我知道(1)" ,
"properties" : {
"描述" : "算法的多分支结构,判断闰年的规则" ,
"编号" : 3.3 ,
"名称" : "闰年平年我知道(1)"
}
}
] ,
"links" : [
{
"source" : "2" ,
"target" : "101" ,
"value" : "父子"
}
]
}
4.2 学习 Vue & Echarts 完成上述步骤后,可结合 Vue 框架与 Echarts 库实现前端可视化展示。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
RSA密钥对生成器 生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
Keycode 信息 查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
Escape 与 Native 编解码 JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
Mermaid 预览与可视化编辑 基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
JavaScript / HTML 格式化 使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online