Neo4j 是原生圖資料庫,擅長處理高度關聯數據。Spring Data Neo4j (SDN) 提供 Repository 抽象、物件圖映射 (OGM)、Cypher 查詢支援,讓 Spring Boot 應用能像操作 JPA 一樣操作圖數據。本文示範:節點實體建模、關係映射、Repository 定義、嵌入式資料庫配置、測試驗證完整流程。

@NodeEntity
public class User {
@GraphId Long id;
private String name;
@Relationship(type = "從屬", direction = Relationship.OUTGOING)
private Group group;
// getter/setter 略
}
@NodeEntity
public class Group {
@GraphId Long id;
private String name;
// getter/setter 略
}
@Repository
public interface UserRepository extends GraphRepository<User> {
User findByName(String name);
}
GraphRepository 提供基本 CRUD、分頁、排序等方法,findByName 由 SDN 自動實現(派生查詢)。
src/main/resources/application.properties:
spring.data.neo4j.compiler=org.neo4j.ogm.compiler.MultiStatementCypherCompiler
spring.data.neo4j.driver=org.neo4j.ogm.drivers.embedded.driver.EmbeddedDriver
spring.data.neo4j.uri=file:///test/graph.db
嵌入式模式適合開發測試,生產環境建議使用 Bolt 驅動連接獨立 Neo4j 服務器。
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = Neo4jConfig.class)
public class Neo4jTest {
private static final Logger log = LoggerFactory.getLogger(Neo4jTest.class);
@Autowired UserRepository userRepository;
@Before
public void addData() {
Group group = new Group(); group.setName("admins");
User user = new User(); user.setName("admin"); user.setGroup(group);
userRepository.save(user);
Assert.notNull(user.getId());
}
@Test
public void getData() {
User user = userRepository.findByName("admin");
Assert.notNull(user);
log.info("user name={}, group name={}", user.getName(), user.getGroup().getName());
}
}
================== user name=admin; group name=admins ==================
@Index(unique = true)@Query("MATCH ...") 註解實現複雜圖遍歷@Transactional 支援圖操作原子性org.neo4j.ogm.drivers.bolt.driver.BoltDriver,uri 改為 bolt://localhost:7687Spring Data Neo4j 讓圖資料庫操作變得像關係型資料庫一樣直觀,是構建推薦系統、社交網絡、欺詐偵測等關聯密集型應用的利器。