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

简介: Apache Jena 是 Java 生态中成熟的语义网开源框架,提供 RDF 存储、SPARQL 查询、TDB2 图数据库、Fuseki 服务端、本体建模、逻辑推理与 SHACL 验证等全栈能力,是构建企业级知识图谱与 AI 语义后端的理想基础设施。(239字)

前面我们讲了 Graphiti、Ontop、TrustGraph、Owlready2。
这次换到 Java 生态,聊一个 Semantic Web 领域非常经典的项目:Apache Jena

在这里插入图片描述

项目地址:

https://github.com/apache/jena

官网:

https://jena.apache.org/

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

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

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

Jena 更像是一整套:

RDF
+
SPARQL
+
TDB2
+
Fuseki
+
Ontology
+
SHACL

组合起来的基础设施。


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

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

比如:

Owlready2
↓
Python + Ontology

Graphiti:

Temporal Knowledge Graph
↓
Agent Memory

TrustGraph:

Context Layer
↓
GraphRAG / Agent

Ontop:

Virtual Knowledge Graph
↓
Database Semantic Layer

而 Apache Jena 更像是在解决:

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

这个时候 Jena 就很合适。

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

Java API

Maven

Server

Storage

Query Engine

HTTP Endpoint

只不过它操作的不是:

MySQL Table

而是:

RDF Graph

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

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

Neo4j

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

Neo4j 更偏:

Property Graph Database

而 Apache Jena 更偏:

RDF / Semantic Web

简单理解:

Neo4j 常见模型:

(:Person)-[:WORKS_FOR]->(:Company)

Jena 更偏标准 RDF Triple:

Subject
Predicate
Object

例如:

王仕宇
worksFor
JavaPub

就是一个 Triple。


三、RDF 是理解 Jena 的第一步

RDF:

Resource Description Framework

不要被名字吓到。

最简单理解:

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

结构:

Subject
Predicate
Object

比如:

王仕宇
created
JavaPub

可以写成:

Subject:
王仕宇

Predicate:
created

Object:
JavaPub

再比如:

JavaPub
focusesOn
AI

两个 Triple 连起来:

王仕宇
   |
 created
   ↓
JavaPub
   |
focusesOn
   ↓
  AI

知识图谱就开始形成了。


四、用 Jena 创建第一张 RDF 图

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

例如:

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");
    }
}

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

王仕宇
↓
created
↓
JavaPub

只是用 Java 写了出来。


五、为什么这里叫 Model?

Jena 里面:

Model

可以简单理解成:

一张 RDF Graph。

比如:

Model model

里面可以有:

Entity

Relationship

Literal

例如:

王仕宇
created
JavaPub

再加:

JavaPub
hasWebsite
https://javapub.net.cn/

于是:

王仕宇
   |
 created
   ↓
JavaPub
   |
hasWebsite
   ↓
https://javapub.net.cn/

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

RDF 里不会只写:

JavaPub

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

https://javapub.net.cn/kg/javapub

为什么?

因为真实世界里:

Apple

可能是:

Apple 公司

苹果水果

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

所以知识图谱喜欢:

IRI

它本质上解决:

这个实体到底是谁?

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

Global Identity

七、Literal 是什么?

不是所有 Object 都是实体。

例如:

王仕宇
age
30

这里:

30

就是 Literal。

再比如:

JavaPub
name
"JavaPub"

其中:

"JavaPub"

也是 Literal。

所以一个 Triple:

Subject
Predicate
Object

Object 可以是:

Resource

也可以是:

Literal

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

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

例如:

RDF/XML

Turtle

N-Triples

JSON-LD

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

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

如果:

RDF

负责:

存知识。

那么:

SPARQL

负责:

查知识。

SPARQL 可以简单理解成:

知识图谱世界里的 SQL

例如 SQL:

SELECT name
FROM users;

SPARQL:

SELECT ?x
WHERE {
    ?x ex:created ex:javapub .
}

意思:

谁创建了 JavaPub?

结果:

王仕宇

十、Java 中执行 SPARQL

例如:

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);
}

整个流程:

SPARQL
↓
ARQ
↓
RDF Model
↓
Result

十一、ARQ 是什么?

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

ARQ

你可以把它理解成:

SPARQL Query Engine

类似数据库里的:

SQL Query Engine

它负责:

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

如果数据只有:

100 个 Triple

直接放内存就可以。

但是如果:

100 万

1000 万

上亿 Triple

显然不能只放:

ModelFactory.createDefaultModel()

这个时候需要:

TDB2

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

可以理解成:

RDF Database

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


十三、TDB2 可以怎么理解?

普通数据库:

Java
↓
JDBC
↓
MySQL

Jena:

Java
↓
Jena API
↓
TDB2

TDB2 专门存:

RDF Triple / Quad

所以:

Knowledge Graph
↓
TDB2

可以真正持久化。


十四、一个 TDB2 示例

例如:

Dataset dataset =
    TDB2Factory.connectDataset("./data/tdb2");

然后:

dataset.begin(ReadWrite.WRITE);

try {
   

    Model model = dataset.getDefaultModel();

    // 写入 RDF

    dataset.commit();

} finally {
   

    dataset.end();
}

这就开始有:

Transaction

的味道了。

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


十五、第四个核心:Fuseki

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

Jena API

就够了。

但是如果你希望:

Python

Node.js

Agent

前端

其他服务

也能访问怎么办?

这个时候用:

Apache Jena Fuseki

Fuseki 是 Jena 的:

SPARQL Server

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


十六、Fuseki 是什么感觉?

可以理解成:

TDB2
↓
Fuseki
↓
HTTP
↓
SPARQL Endpoint

例如:

http://localhost:3030/ds/query

其他程序:

POST SPARQL

就可以查询。

所以:

Java
Python
Node
LLM
Agent

都可以连接。


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

整体:

                    Client

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

        ↓            ↓            ↓

      Java         Python      AI Agent

        \            |            /

                  HTTP

                   ↓

                 Fuseki

                   ↓

                 SPARQL

                   ↓

                  TDB2

                   ↓

             Knowledge Graph

这已经非常接近一个:

Semantic Data Service

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

我会这样类比:

传统后端:

Spring Boot
↓
MyBatis / JPA
↓
MySQL

Semantic Web:

Fuseki
↓
SPARQL / Jena
↓
TDB2

只不过传统后端操作:

Table
Row
Column

Jena 操作:

Entity
Relation
Triple

十九、Jena 还支持 Ontology

Jena 不只是 RDF。

它也提供 Ontology API。

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

jena-ontapi

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

所以可以建立:

Class

Subclass

ObjectProperty

DatatypeProperty

例如:

Developer
is-a
Person

二十、Ontology 和 RDF Graph 的区别

RDF:

王仕宇
created
JavaPub

描述:

Fact

Ontology:

Developer
is-a
Person

描述:

World Structure

所以:

Ontology
↓
定义世界

RDF:

↓
记录世界

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


二十一、Jena + Reasoning

Jena 也有:

Inference

也就是:

推理

比如:

Developer
is-a
Person

然后:

王仕宇
is-a
Developer

系统可以推断:

王仕宇
is-a
Person

也就是说:

Known Facts
+
Rules
=
New Facts

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

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

LLM:

概率推理

Ontology Reasoner:

逻辑推理

LLM 可能说:

我认为大概率是这样。

Reasoner:

根据规则,必然成立。

所以未来 Agent 很可能是:

LLM
+
Semantic Reasoner

而不是所有事情:

全部交给模型猜。

二十三、Jena 还支持 SHACL

SHACL 用来:

验证图数据

比如规定:

Person
必须有 name

或者:

Order
必须有 amount

甚至:

age
必须是 integer

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

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


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

未来可能是:

Document
↓
LLM
↓
Entity Extraction
↓
Relation Extraction
↓
Knowledge Graph

问题:

LLM 会错。

所以:

LLM Output
↓
SHACL
↓
Validation
↓
Graph

这样会稳定很多。


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

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

以前 Jena:

Semantic Web

现在可以:

LLM
+
Knowledge Graph

例如:

用户输入文档
↓
LLM
↓
实体抽取
↓
关系抽取
↓
Jena
↓
RDF
↓
TDB2

然后:

Agent
↓
SPARQL
↓
Fuseki
↓
Knowledge Graph

整个链条就跑起来了。


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

例如:

                     User

                      ↓

                   AI Agent

                      ↓

                     LLM

                 /           \

                ↓             ↓

          Vector Search     SPARQL

                ↓             ↓

             Documents      Fuseki

                               ↓

                              TDB2

                               ↓

                       Knowledge Graph

这就是:

Vector RAG
+
Graph RAG

结合。


二十七、Jena + GraphRAG

假设:

Document A:

王仕宇创建 JavaPub

Document B:

JavaPub 发布 AI 内容

Document C:

AI 内容包含 Agent 教程

Graph:

王仕宇
 ↓ created
JavaPub
 ↓ publishes
AI Content
 ↓ includes
Agent Tutorial

用户问:

王仕宇创建的品牌里,
有哪些 Agent 相关内容?

Agent 可以:

Entity Linking
↓
SPARQL
↓
Graph Traversal
↓
Subgraph
↓
LLM

这就是 GraphRAG 的雏形。


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

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

很多企业原来的技术栈:

Java

Spring

Oracle

MySQL

Kafka

Redis

如果突然上一套:

全 Python AI Stack

不一定适合。

Jena 可以直接:

Spring Boot
+
Jena

做:

Semantic Service

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


二十九、Jena + Spring Boot

完全可以:

Controller
↓
Service
↓
Jena
↓
TDB2

例如 API:

GET /api/graph/customer/{id}

内部:

SPARQL

查询:

Customer
↓
Order
↓
Product

再返回:

{
   
  "customer": "...",
  "orders": [],
  "products": []
}

这就变成:

Graph API

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

我觉得这个词很好理解:

Semantic Backend

传统 Backend:

API
↓
Database

Semantic Backend:

API
↓
Ontology
↓
Knowledge Graph
↓
SPARQL
↓
Data

AI Agent:

↓
Semantic Backend

不再需要理解几百张表。


三十一、Jena 和 Owlready2 怎么选?

Owlready2:

Python

优点:

和 LLM / AI 生态结合方便

Jena:

Java

优点:

企业后端
服务化
SPARQL Server
RDF Infrastructure

所以我会这么理解:

Owlready2
↓
Ontology SDK

Jena:

↓
Semantic Platform

三十二、Jena 和 Ontop 怎么选?

Ontop:

Database
↓
Virtual Knowledge Graph

特点:

数据不搬

Jena:

RDF
↓
TDB2

特点:

真正构建 RDF Graph

所以:

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

Ontop

可能更好。

如果你就是要建设:

RDF Knowledge Graph

Jena 更合适。


三十三、Jena 和 Neo4j 怎么选?

Neo4j:

Property Graph
+
Cypher

Jena:

RDF
+
SPARQL
+
OWL

Neo4j 更工程化:

Graph Application

Jena 更标准化:

Semantic Web

如果你特别需要:

Ontology

OWL

RDF Standard

SPARQL

Jena 会更自然。


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

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

企业知识图谱展示页面

我会做:

Semantic Agent Backend

架构:

Business Documents
Database
API

      ↓

     LLM

      ↓

Knowledge Extraction

      ↓

   Apache Jena

      ↓

     TDB2

      ↓

    Fuseki

      ↓

AI Agent / MCP

也就是说:

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


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

可以自己做一个 MCP Server:

MCP
↓
SPARQL
↓
Fuseki

Agent 调用:

query_knowledge_graph

输入:

“JavaPub 和哪些 AI 项目有关?”

MCP Server:

Natural Language
↓
SPARQL
↓
Fuseki
↓
Result

再返回给:

Claude Code
Codex
Cursor

这就开始变成:

Knowledge Tool

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

以前做后端:

Database

就是:

Source of Truth

但 AI Agent:

不能直接理解:

500 张表

3000 个字段

几十种系统

它需要:

Customer

Order

Product

Supplier

Payment

这样的:

Semantic World

所以:

Database
↓
Data Layer

Knowledge Graph:

↓
Semantic Layer

Agent:

↓
Action Layer

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

现在我们已经聊了:

Owlready2

Ontop

Graphiti

TrustGraph

Apache Jena

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

                        AI Agent

                           ↓

                       TrustGraph

                    Context Layer

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

          ↓              ↓              ↓

       Graphiti         Jena          Ontop

          ↓              ↓              ↓

       Memory       RDF / SPARQL    Database

                          ↑

                       Ontology

                          ↑

                      Owlready2

可以理解成:

Owlready2
↓
Ontology Creation

Jena
↓
Semantic Infrastructure

Ontop
↓
Database Semantic Layer

Graphiti
↓
Temporal Memory

TrustGraph
↓
Agent Context

这套组合已经非常接近:

Ontology-driven Agent Stack

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

我的答案是:

值得。

但不是因为:

Semantic Web 很流行。

而是因为:

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

以前大家嫌:

RDF

OWL

SPARQL

太复杂。

现在问题反过来了:

LLM 太自由。

于是我们又需要:

Schema

Ontology

Constraint

Graph

Reasoning

给它增加结构。

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


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

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

Apache Jena 6.2.0

以及:

Apache Jena Fuseki 6.2.0

Jena 6 要求:

Java 21+

Jena 6.0 开始还明确推荐:

TDB2

并逐渐弱化旧的 TDB1。

所以如果现在新建项目:

Java 21
+
Jena 6
+
TDB2
+
Fuseki

会比较合理。


四十、总结

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

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

它解决:

如何表示知识?

↓

RDF

如何查询:

↓

SPARQL

如何存:

↓

TDB2

如何提供服务:

↓

Fuseki

如何定义世界:

↓

Ontology

如何验证:

↓

SHACL

最后:

↓

AI Agent

如果把整个链条压缩成:

Business Data
↓
RDF
↓
Ontology
↓
Knowledge Graph
↓
SPARQL
↓
Context
↓
Agent

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

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

Semantic Web 老项目

我更愿意把它看成:

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

过去:

Spring Boot
+
MySQL

解决:

程序如何访问数据。

未来:

Spring Boot
+
Apache Jena
+
Knowledge Graph

可能解决:

AI 如何理解业务数据。

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


项目地址

GitHub:

https://github.com/apache/jena

官网:

https://jena.apache.org/

王仕宇 JavaPub

https://javapub.net.cn/

目录
相关文章
人工智能 缓存 前端开发
12023 63
人工智能 JavaScript 开发工具
4805 17
Web App开发 人工智能 API
1381 1
人工智能 Java BI
1467 1
开发工具 Swift git
1972 6
人工智能 JavaScript 测试技术
2402 2
人工智能 自然语言处理 安全
980 0
人工智能 JavaScript 测试技术
1199 4
缓存 JavaScript Shell
2099 3

热门文章

最新文章