import com.alibaba.cloud.ai.graph.*;
import com.alibaba.cloud.ai.graph.state.strategy.*;
import java.util.*;
import static com.alibaba.cloud.ai.graph.action.AsyncNodeAction.nodeasync;
import static com.alibaba.cloud.ai.graph.action.AsyncEdgeAction.edgeasync;
// 数据验证子图
public StateGraph createValidationSubGraph() {
KeyStrategyFactory keyFactory = () -> {
HashMap<String, KeyStrategy> strategies = new HashMap<>();
strategies.put("data", new ReplaceStrategy());
strategies.put("isValid", new ReplaceStrategy());
strategies.put("error", new ReplaceStrategy());
return strategies;
};
return new StateGraph(keyFactory)
.addNode("checkFormat", nodeasync(state -> {
String data = (String) state.value("data").orElse("");
boolean valid = data.matches("^[A-Za-z0-9]+$");
return Map.of(
"isValid", valid,
"error", valid ? "" : "Invalid format"
);
}))
.addEdge(StateGraph.START, "checkFormat")
.addEdge("checkFormat", StateGraph.END);
}
// 数据转换子图
public StateGraph createTransformSubGraph() {
KeyStrategyFactory keyFactory = () -> {
HashMap<String, KeyStrategy> strategies = new HashMap<>();
strategies.put("data", new ReplaceStrategy());
strategies.put("transformed", new ReplaceStrategy());
return strategies;
};
return new StateGraph(keyFactory)
.addNode("uppercase", nodeasync(state -> {
String data = (String) state.value("data").orElse("");
return Map.of("transformed", data.toUpperCase());
}))
.addNode("addPrefix", nodeasync(state -> {
String data = (String) state.value("transformed").orElse("");
return Map.of("transformed", "PROC_" + data);
}))
.addEdge(StateGraph.START, "uppercase")
.addEdge("uppercase", "addPrefix")
.addEdge("addPrefix", StateGraph.END);
}
// 主处理流程
public StateGraph createMainGraph() {
KeyStrategyFactory keyFactory = () -> {
HashMap<String, KeyStrategy> strategies = new HashMap<>();
strategies.put("data", new ReplaceStrategy());
strategies.put("isValid", new ReplaceStrategy());
strategies.put("transformed", new ReplaceStrategy());
strategies.put("result", new ReplaceStrategy());
return strategies;
};
StateGraph validationSub = createValidationSubGraph();
StateGraph transformSub = createTransformSubGraph();
return new StateGraph(keyFactory)
.addNode("validate", validationSub)
.addNode("transform", transformSub)
.addNode("finalize", nodeasync(state -> {
String result = (String) state.value("transformed").orElse("No result");
return Map.of("result", "Final: " + result);
}))
.addEdge(StateGraph.START, "validate")
.addConditionalEdges("validate",
edgeasync(state -> {
Boolean valid = (Boolean) state.value("isValid").orElse(false);
return valid ? "continue" : "error";
}),
Map.of(
"continue", "transform",
"error", StateGraph.END
))
.addEdge("transform", "finalize")
.addEdge("finalize", StateGraph.END);
}
// 使用
CompiledGraph graph = createMainGraph().compile();
OverAllState result = graph.invoke(Map.of("data", "test123"));
System.out.println("Result: " + result.value("result").orElse(""));
// 输出: Result: Final: PROC_TEST123


- 子图作为 NodeAction – 另一种集成方式
- 子图作为 CompiledGraph – 编译后使用
- 快速入门 – Graph 基础
本文整理自 Spring AI Alibaba 官方文档《子图作为 StateGraph》:https://java2ai.com/docs/frameworks/graph-core/examples/subgraph-as-stategraph

AI项目博客






