Apache Jena 详解:Java 开发者如何真正搭起一套知识图谱与语义服务

前面我们讲了 Graphiti、Ontop、TrustGraph、Owlready2。

这次换到 Java 生态,聊一个 Semantic Web 领域非常经典的项目:Apache Jena

项目地址:

text 复制代码
https://github.com/apache/jena

官网:

text 复制代码
https://jena.apache.org/

如果只用一句话介绍 Apache Jena:

它是一套用 Java 构建 RDF、SPARQL、Ontology、知识图谱和语义服务的完整开源框架。

而且它不是一个单点工具。

Jena 更像是一整套:

text 复制代码
RDF
+
SPARQL
+
TDB2
+
Fuseki
+
Ontology
+
SHACL

组合起来的基础设施。


一、为什么我要单独讲 Apache Jena?

从我的角度来说,前面我们聊的几个项目,特点都很鲜明。

比如:

text 复制代码
Owlready2
↓
Python + Ontology

Graphiti:

text 复制代码
Temporal Knowledge Graph
↓
Agent Memory

TrustGraph:

text 复制代码
Context Layer
↓
GraphRAG / Agent

Ontop:

text 复制代码
Virtual Knowledge Graph
↓
Database Semantic Layer

而 Apache Jena 更像是在解决:

如果我就想从底层搭一套标准的 Semantic Web / Knowledge Graph 服务,该怎么办?

这个时候 Jena 就很合适。

尤其如果你本身是 Java 后端开发者,会发现它的风格其实非常熟悉:

text 复制代码
Java API

Maven

Server

Storage

Query Engine

HTTP Endpoint

只不过它操作的不是:

text 复制代码
MySQL Table

而是:

text 复制代码
RDF Graph

二、先理解一个关键点:Jena 不是 Neo4j

很多人一听知识图谱,就会想到:

text 复制代码
Neo4j

但是 Apache Jena 和 Neo4j 的定位并不一样。

Neo4j 更偏:

text 复制代码
Property Graph Database

而 Apache Jena 更偏:

text 复制代码
RDF / Semantic Web

简单理解:

Neo4j 常见模型:

text 复制代码
(:Person)-[:WORKS_FOR]->(:Company)

Jena 更偏标准 RDF Triple:

text 复制代码
Subject
Predicate
Object

例如:

text 复制代码
王仕宇
worksFor
JavaPub

就是一个 Triple。


三、RDF 是理解 Jena 的第一步

RDF:

text 复制代码
Resource Description Framework

不要被名字吓到。

最简单理解:

RDF 就是用三元组描述世界。

结构:

text 复制代码
Subject
Predicate
Object

比如:

text 复制代码
王仕宇
created
JavaPub

可以写成:

text 复制代码
Subject:
王仕宇

Predicate:
created

Object:
JavaPub

再比如:

text 复制代码
JavaPub
focusesOn
AI

两个 Triple 连起来:

text 复制代码
王仕宇
   |
 created
   ↓
JavaPub
   |
focusesOn
   ↓
  AI

知识图谱就开始形成了。


四、用 Jena 创建第一张 RDF 图

Java 里可以直接创建一个 Model。

例如:

java 复制代码
import org.apache.jena.rdf.model.*;

public class JenaDemo {

    public static void main(String[] args) {

        Model model = ModelFactory.createDefaultModel();

        String ns = "https://javapub.net.cn/kg/";

        Resource shiyu = model.createResource(ns + "wang-shiyu");

        Resource javapub = model.createResource(ns + "javapub");

        Property created = model.createProperty(ns + "created");

        shiyu.addProperty(created, javapub);

        model.write(System.out, "TURTLE");
    }
}

这里做的事情其实很简单:

text 复制代码
王仕宇
↓
created
↓
JavaPub

只是用 Java 写了出来。


五、为什么这里叫 Model?

Jena 里面:

text 复制代码
Model

可以简单理解成:

一张 RDF Graph。

比如:

text 复制代码
Model model

里面可以有:

text 复制代码
Entity

Relationship

Literal

例如:

text 复制代码
王仕宇
created
JavaPub

再加:

text 复制代码
JavaPub
hasWebsite
https://javapub.net.cn/

于是:

text 复制代码
王仕宇
   |
 created
   ↓
JavaPub
   |
hasWebsite
   ↓
https://javapub.net.cn/

六、URI / IRI 为什么这么重要?

RDF 里不会只写:

text 复制代码
JavaPub

通常会写成一个唯一标识:

text 复制代码
https://javapub.net.cn/kg/javapub

为什么?

因为真实世界里:

text 复制代码
Apple

可能是:

text 复制代码
Apple 公司

苹果水果

如果只用字符串,很容易冲突。

所以知识图谱喜欢:

text 复制代码
IRI

它本质上解决:

这个实体到底是谁?

这也是 Semantic Web 一个非常重要的思想:

text 复制代码
Global Identity

七、Literal 是什么?

不是所有 Object 都是实体。

例如:

text 复制代码
王仕宇
age
30

这里:

text 复制代码
30

就是 Literal。

再比如:

text 复制代码
JavaPub
name
"JavaPub"

其中:

text 复制代码
"JavaPub"

也是 Literal。

所以一个 Triple:

text 复制代码
Subject
Predicate
Object

Object 可以是:

text 复制代码
Resource

也可以是:

text 复制代码
Literal

八、Turtle:比 RDF/XML 好看很多

RDF 可以有很多序列化格式。

例如:

text 复制代码
RDF/XML

Turtle

N-Triples

JSON-LD

我个人更推荐学习时先看:

text 复制代码
Turtle

例如:

turtle 复制代码
@prefix ex: <https://javapub.net.cn/kg/> .

ex:wang-shiyu
    ex:created ex:javapub .

ex:javapub
    ex:focusesOn ex:ai .

看起来是不是比 XML 舒服很多?

所以如果刚学:

不要一上来盯着 RDF/XML。

先用 Turtle。


九、Jena 第二个核心:SPARQL

如果:

text 复制代码
RDF

负责:

存知识。

那么:

text 复制代码
SPARQL

负责:

查知识。

SPARQL 可以简单理解成:

text 复制代码
知识图谱世界里的 SQL

例如 SQL:

sql 复制代码
SELECT name
FROM users;

SPARQL:

sparql 复制代码
SELECT ?x
WHERE {
    ?x ex:created ex:javapub .
}

意思:

谁创建了 JavaPub?

结果:

text 复制代码
王仕宇

十、Java 中执行 SPARQL

例如:

java 复制代码
String queryString = """
PREFIX ex: <https://javapub.net.cn/kg/>

SELECT ?person
WHERE {
    ?person ex:created ex:javapub .
}
""";

Query query = QueryFactory.create(queryString);

try (QueryExecution qexec =
         QueryExecutionFactory.create(query, model)) {

    ResultSet results = qexec.execSelect();

    ResultSetFormatter.out(System.out, results, query);
}

整个流程:

text 复制代码
SPARQL
↓
ARQ
↓
RDF Model
↓
Result

十一、ARQ 是什么?

Apache Jena 里面负责 SPARQL 的核心引擎叫:

text 复制代码
ARQ

你可以把它理解成:

text 复制代码
SPARQL Query Engine

类似数据库里的:

text 复制代码
SQL Query Engine

它负责:

text 复制代码
Parse

Optimize

Execute

Return Result

Jena 6 系列已经在跟进 RDF 1.2 和 SPARQL 1.2 的相关能力,6.1.0 的官方变更记录明确提到对 RDF 1.2 格式和 SPARQL 1.2 Query / Update / Result formats 的支持。


十二、第三个核心:TDB2

如果数据只有:

text 复制代码
100 个 Triple

直接放内存就可以。

但是如果:

text 复制代码
100 万

1000 万

上亿 Triple

显然不能只放:

text 复制代码
ModelFactory.createDefaultModel()

这个时候需要:

text 复制代码
TDB2

TDB2 是 Jena 的原生 RDF 数据存储。

可以理解成:

text 复制代码
RDF Database

官方发行包本身就包含 TDB,Jena 当前则主要推荐 TDB2;Jena 6.0 的变更说明也明确建议迁移到 TDB2。


十三、TDB2 可以怎么理解?

普通数据库:

text 复制代码
Java
↓
JDBC
↓
MySQL

Jena:

text 复制代码
Java
↓
Jena API
↓
TDB2

TDB2 专门存:

text 复制代码
RDF Triple / Quad

所以:

text 复制代码
Knowledge Graph
↓
TDB2

可以真正持久化。


十四、一个 TDB2 示例

例如:

java 复制代码
Dataset dataset =
    TDB2Factory.connectDataset("./data/tdb2");

然后:

java 复制代码
dataset.begin(ReadWrite.WRITE);

try {

    Model model = dataset.getDefaultModel();

    // 写入 RDF

    dataset.commit();

} finally {

    dataset.end();
}

这就开始有:

text 复制代码
Transaction

的味道了。

对于后端开发者来说,非常熟悉。


十五、第四个核心:Fuseki

如果只有 Java 程序内部访问图:

text 复制代码
Jena API

就够了。

但是如果你希望:

text 复制代码
Python

Node.js

Agent

前端

其他服务

也能访问怎么办?

这个时候用:

text 复制代码
Apache Jena Fuseki

Fuseki 是 Jena 的:

text 复制代码
SPARQL Server

官方当前下载页把 Jena Fuseki 单独作为 SPARQL Server 提供,6.2.0 也有独立 Fuseki 二进制发行包。


十六、Fuseki 是什么感觉?

可以理解成:

text 复制代码
TDB2
↓
Fuseki
↓
HTTP
↓
SPARQL Endpoint

例如:

text 复制代码
http://localhost:3030/ds/query

其他程序:

text 复制代码
POST SPARQL

就可以查询。

所以:

text 复制代码
Java
Python
Node
LLM
Agent

都可以连接。


十七、这就变成真正的 Knowledge Graph Server 了

整体:

text 复制代码
                    Client

        ┌────────────┼────────────┐

        ↓            ↓            ↓

      Java         Python      AI Agent

        \            |            /

                  HTTP

                   ↓

                 Fuseki

                   ↓

                 SPARQL

                   ↓

                  TDB2

                   ↓

             Knowledge Graph

这已经非常接近一个:

text 复制代码
Semantic Data Service

十八、如果从后端工程师角度理解

我会这样类比:

传统后端:

text 复制代码
Spring Boot
↓
MyBatis / JPA
↓
MySQL

Semantic Web:

text 复制代码
Fuseki
↓
SPARQL / Jena
↓
TDB2

只不过传统后端操作:

text 复制代码
Table
Row
Column

Jena 操作:

text 复制代码
Entity
Relation
Triple

十九、Jena 还支持 Ontology

Jena 不只是 RDF。

它也提供 Ontology API。

Jena 6 现在已经从旧的 org.apache.jena.ontology 转向:

text 复制代码
jena-ontapi

官方 5.6.0 的迁移说明明确写了 Jena 6 会切换到 org.apache.jena.ontapi

所以可以建立:

text 复制代码
Class

Subclass

ObjectProperty

DatatypeProperty

例如:

text 复制代码
Developer
is-a
Person

二十、Ontology 和 RDF Graph 的区别

RDF:

text 复制代码
王仕宇
created
JavaPub

描述:

text 复制代码
Fact

Ontology:

text 复制代码
Developer
is-a
Person

描述:

text 复制代码
World Structure

所以:

text 复制代码
Ontology
↓
定义世界

RDF:

text 复制代码
↓
记录世界

这是我现在特别喜欢的一个理解方式。


二十一、Jena + Reasoning

Jena 也有:

text 复制代码
Inference

也就是:

text 复制代码
推理

比如:

text 复制代码
Developer
is-a
Person

然后:

text 复制代码
王仕宇
is-a
Developer

系统可以推断:

text 复制代码
王仕宇
is-a
Person

也就是说:

text 复制代码
Known Facts
+
Rules
=
New Facts

二十二、这和 LLM 推理有什么区别?

我觉得这个问题特别重要。

LLM:

text 复制代码
概率推理

Ontology Reasoner:

text 复制代码
逻辑推理

LLM 可能说:

text 复制代码
我认为大概率是这样。

Reasoner:

text 复制代码
根据规则,必然成立。

所以未来 Agent 很可能是:

text 复制代码
LLM
+
Semantic Reasoner

而不是所有事情:

text 复制代码
全部交给模型猜。

二十三、Jena 还支持 SHACL

SHACL 用来:

text 复制代码
验证图数据

比如规定:

text 复制代码
Person
必须有 name

或者:

text 复制代码
Order
必须有 amount

甚至:

text 复制代码
age
必须是 integer

Jena 当前官方 Javadoc 里仍然提供独立的 SHACL 模块。

这对 AI 自动生成知识图谱特别重要。


二十四、为什么 AI + SHACL 很重要?

未来可能是:

text 复制代码
Document
↓
LLM
↓
Entity Extraction
↓
Relation Extraction
↓
Knowledge Graph

问题:

text 复制代码
LLM 会错。

所以:

text 复制代码
LLM Output
↓
SHACL
↓
Validation
↓
Graph

这样会稳定很多。


二十五、Jena + LLM 可以怎么玩?

这才是我觉得 Jena 在今天重新有意思的地方。

以前 Jena:

text 复制代码
Semantic Web

现在可以:

text 复制代码
LLM
+
Knowledge Graph

例如:

text 复制代码
用户输入文档
↓
LLM
↓
实体抽取
↓
关系抽取
↓
Jena
↓
RDF
↓
TDB2

然后:

text 复制代码
Agent
↓
SPARQL
↓
Fuseki
↓
Knowledge Graph

整个链条就跑起来了。


二十六、一个完整的 Java AI Knowledge Graph 架构

例如:

text 复制代码
                     User

                      ↓

                   AI Agent

                      ↓

                     LLM

                 /           \

                ↓             ↓

          Vector Search     SPARQL

                ↓             ↓

             Documents      Fuseki

                               ↓

                              TDB2

                               ↓

                       Knowledge Graph

这就是:

text 复制代码
Vector RAG
+
Graph RAG

结合。


二十七、Jena + GraphRAG

假设:

text 复制代码
Document A:

王仕宇创建 JavaPub

Document B:

text 复制代码
JavaPub 发布 AI 内容

Document C:

text 复制代码
AI 内容包含 Agent 教程

Graph:

text 复制代码
王仕宇
 ↓ created
JavaPub
 ↓ publishes
AI Content
 ↓ includes
Agent Tutorial

用户问:

text 复制代码
王仕宇创建的品牌里,
有哪些 Agent 相关内容?

Agent 可以:

text 复制代码
Entity Linking
↓
SPARQL
↓
Graph Traversal
↓
Subgraph
↓
LLM

这就是 GraphRAG 的雏形。


二十八、为什么 Java 生态很适合企业知识图谱?

从我的角度来说,这是 Jena 比较现实的优势。

很多企业原来的技术栈:

text 复制代码
Java

Spring

Oracle

MySQL

Kafka

Redis

如果突然上一套:

text 复制代码
全 Python AI Stack

不一定适合。

Jena 可以直接:

text 复制代码
Spring Boot
+
Jena

做:

text 复制代码
Semantic Service

对于已有 Java 团队来说,迁移成本会低很多。


二十九、Jena + Spring Boot

完全可以:

text 复制代码
Controller
↓
Service
↓
Jena
↓
TDB2

例如 API:

text 复制代码
GET /api/graph/customer/{id}

内部:

text 复制代码
SPARQL

查询:

text 复制代码
Customer
↓
Order
↓
Product

再返回:

json 复制代码
{
  "customer": "...",
  "orders": [],
  "products": []
}

这就变成:

text 复制代码
Graph API

三十、甚至可以做一个 Semantic Backend

我觉得这个词很好理解:

text 复制代码
Semantic Backend

传统 Backend:

text 复制代码
API
↓
Database

Semantic Backend:

text 复制代码
API
↓
Ontology
↓
Knowledge Graph
↓
SPARQL
↓
Data

AI Agent:

text 复制代码
↓
Semantic Backend

不再需要理解几百张表。


三十一、Jena 和 Owlready2 怎么选?

Owlready2:

text 复制代码
Python

优点:

text 复制代码
和 LLM / AI 生态结合方便

Jena:

text 复制代码
Java

优点:

text 复制代码
企业后端
服务化
SPARQL Server
RDF Infrastructure

所以我会这么理解:

text 复制代码
Owlready2
↓
Ontology SDK

Jena:

text 复制代码
↓
Semantic Platform

三十二、Jena 和 Ontop 怎么选?

Ontop:

text 复制代码
Database
↓
Virtual Knowledge Graph

特点:

text 复制代码
数据不搬

Jena:

text 复制代码
RDF
↓
TDB2

特点:

text 复制代码
真正构建 RDF Graph

所以:

如果数据已经在大型关系数据库:

text 复制代码
Ontop

可能更好。

如果你就是要建设:

text 复制代码
RDF Knowledge Graph

Jena 更合适。


三十三、Jena 和 Neo4j 怎么选?

Neo4j:

text 复制代码
Property Graph
+
Cypher

Jena:

text 复制代码
RDF
+
SPARQL
+
OWL

Neo4j 更工程化:

text 复制代码
Graph Application

Jena 更标准化:

text 复制代码
Semantic Web

如果你特别需要:

text 复制代码
Ontology

OWL

RDF Standard

SPARQL

Jena 会更自然。


三十四、从我的角度,我会怎么用 Jena?

如果让我现在做一个项目,我不会只做:

text 复制代码
企业知识图谱展示页面

我会做:

text 复制代码
Semantic Agent Backend

架构:

text 复制代码
Business Documents
Database
API

      ↓

     LLM

      ↓

Knowledge Extraction

      ↓

   Apache Jena

      ↓

     TDB2

      ↓

    Fuseki

      ↓

AI Agent / MCP

也就是说:

让 Jena 成为 Agent 背后的一层 Semantic Data Service。


三十五、Jena + MCP 也很有想象力

可以自己做一个 MCP Server:

text 复制代码
MCP
↓
SPARQL
↓
Fuseki

Agent 调用:

text 复制代码
query_knowledge_graph

输入:

text 复制代码
"JavaPub 和哪些 AI 项目有关?"

MCP Server:

text 复制代码
Natural Language
↓
SPARQL
↓
Fuseki
↓
Result

再返回给:

text 复制代码
Claude Code
Codex
Cursor

这就开始变成:

text 复制代码
Knowledge Tool

三十六、我越来越觉得"知识图谱不是数据库,而是 AI 的理解层"

以前做后端:

text 复制代码
Database

就是:

text 复制代码
Source of Truth

但 AI Agent:

不能直接理解:

text 复制代码
500 张表

3000 个字段

几十种系统

它需要:

text 复制代码
Customer

Order

Product

Supplier

Payment

这样的:

text 复制代码
Semantic World

所以:

text 复制代码
Database
↓
Data Layer

Knowledge Graph:

text 复制代码
↓
Semantic Layer

Agent:

text 复制代码
↓
Action Layer

三十七、把前面的项目串起来看

现在我们已经聊了:

text 复制代码
Owlready2

Ontop

Graphiti

TrustGraph

Apache Jena

其实已经可以形成一张架构图:

text 复制代码
                        AI Agent

                           ↓

                       TrustGraph

                    Context Layer

          ┌──────────────┼──────────────┐

          ↓              ↓              ↓

       Graphiti         Jena          Ontop

          ↓              ↓              ↓

       Memory       RDF / SPARQL    Database

                          ↑

                       Ontology

                          ↑

                      Owlready2

可以理解成:

text 复制代码
Owlready2
↓
Ontology Creation

Jena
↓
Semantic Infrastructure

Ontop
↓
Database Semantic Layer

Graphiti
↓
Temporal Memory

TrustGraph
↓
Agent Context

这套组合已经非常接近:

text 复制代码
Ontology-driven Agent Stack

三十八、Apache Jena 现在还值得学吗?

我的答案是:

text 复制代码
值得。

但不是因为:

text 复制代码
Semantic Web 很流行。

而是因为:

AI Agent 时代重新需要结构化语义。

以前大家嫌:

text 复制代码
RDF

OWL

SPARQL

太复杂。

现在问题反过来了:

text 复制代码
LLM 太自由。

于是我们又需要:

text 复制代码
Schema

Ontology

Constraint

Graph

Reasoning

给它增加结构。

这时候 Jena 这类成熟工具重新有价值。


三十九、当前版本需要注意什么?

截至 2026 年 8 月,Apache Jena 官方下载页已经提供:

text 复制代码
Apache Jena 6.2.0

以及:

text 复制代码
Apache Jena Fuseki 6.2.0

Jena 6 要求:

text 复制代码
Java 21+

Jena 6.0 开始还明确推荐:

text 复制代码
TDB2

并逐渐弱化旧的 TDB1。

所以如果现在新建项目:

text 复制代码
Java 21
+
Jena 6
+
TDB2
+
Fuseki

会比较合理。


四十、总结

如果只用一句话总结 Apache Jena:

Apache Jena 是 Java 生态里一套非常成熟的 RDF、SPARQL、Ontology、推理和知识图谱基础设施。

它解决:

text 复制代码
如何表示知识?

↓

RDF

如何查询:

text 复制代码
↓

SPARQL

如何存:

text 复制代码
↓

TDB2

如何提供服务:

text 复制代码
↓

Fuseki

如何定义世界:

text 复制代码
↓

Ontology

如何验证:

text 复制代码
↓

SHACL

最后:

text 复制代码
↓

AI Agent

如果把整个链条压缩成:

text 复制代码
Business Data
↓
RDF
↓
Ontology
↓
Knowledge Graph
↓
SPARQL
↓
Context
↓
Agent

Apache Jena 正好处于这条链中间非常关键的位置。

从我的角度来说,我现在不会把它只看成一个:

text 复制代码
Semantic Web 老项目

我更愿意把它看成:

Java 世界里一个成熟的 Semantic Backend 基础设施。

过去:

text 复制代码
Spring Boot
+
MySQL

解决:

程序如何访问数据。

未来:

text 复制代码
Spring Boot
+
Apache Jena
+
Knowledge Graph

可能解决:

AI 如何理解业务数据。

这也是我觉得 Apache Jena 在 Agent 时代重新值得关注的地方。


项目地址

GitHub:

text 复制代码
https://github.com/apache/jena

官网:

text 复制代码
https://jena.apache.org/

王仕宇 JavaPub

https://javapub.net.cn/

相关推荐
lhldsg22 分钟前
线上住宿预约系统开发实战:从需求分析到接口设计
java·大数据·小程序·需求分析
剑指offer.1 小时前
Linux多任务-线程篇
java·jvm·算法
2601_962063971 小时前
Spring Boot拦截器(Interceptor)详解
java·spring boot·后端
这是程序猿1 小时前
深入剖析Java HashMap:底层原理、数据结构与核心机制全解析
java·开发语言·数据结构
不才不才不不才1 小时前
Spring 源码系列(25): @EnableTransactionManagement 与 TransactionInterceptor
java·数据库·spring
隔窗听雨眠1 小时前
CI/CD测试数据清理完全指南:从污染根因到三层清理覆盖的完整方案
java·数据库·ci/cd
Query*1 小时前
Agent 开发之项目 AI 能力自我进化:通过浏览器自动化与数据采集实现持续学习
java·人工智能·ai·自动化
晓晓_za8986681 小时前
GEO 搜索源码白帽合规改造:适配各大 AI 信源收录规则
java·开发语言·人工智能·性能优化·开源
Haooog1 小时前
从 Tool Calling 到 State 并发控制:一个 Agent 如何安全地连续执行任务
java·agent·后端开发