首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

TinkerPop 3 圖數據庫實戰:基於 JPA/Hibernate 將圖數據持久化到 MySQL

     編輯:MySQL 綜合教學

TinkerPop 3 圖數據庫實戰:基於 JPA/Hibernate 將圖數據持久化到 MySQL

Apache TinkerPop 是通用圖計算框架,默認內存存儲不適合生產。本文演示如何通過 blueprints-jpa-graph 擴展,利用 Hibernate/JPA 將頂點、邊、屬性持久化到 MySQL,包含 Maven 依賴、數據庫初始化、Java 代碼增刪改查完整示例。

技術棧

  • TinkerPop 3.0.0-M9 (Gremlin Core/Driver)
  • Blueprints 2.6.0 + blueprints-jpa-graph 2.5.0_01 (Wingnest 擴展)
  • Hibernate 4.3.10 (JPA 實現)
  • MySQL 5.1.35+ (Connector/J)

1. MySQL 數據庫準備

CREATE DATABASE tinkerpop DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
GRANT ALL PRIVILEGES ON tinkerpop.* TO 'tinkerpop'@'%' IDENTIFIED BY 'tinkerpop';
FLUSH PRIVILEGES;

2. Maven 關鍵依賴 (pom.xml 片段)

<repositories>
    <repository>
        <id>wingnest-repo</id>
        <url>https://www.wingnest.com/mvn-repo/</url>
    </repository>
</repositories>

<dependencies>
    <dependency><groupId>org.apache.tinkerpop</groupId><artifactId>gremlin-core</artifactId><version>3.0.0.M9-incubating</version></dependency>
    <dependency><groupId>org.apache.tinkerpop</groupId><artifactId>gremlin-driver</artifactId><version>3.0.0.M9-incubating</version></dependency>
    <dependency><groupId>com.tinkerpop.blueprints</groupId><artifactId>blueprints-core</artifactId><version>2.6.0</version></dependency>
    <dependency><groupId>com.wingnest.blueprints</groupId><artifactId>blueprints-jpa-graph</artifactId><version>2.5.0_01</version></dependency>
    <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-core</artifactId><version>4.3.10.Final</version></dependency>
    <dependency><groupId>org.hibernate</groupId><artifactId>hibernate-entitymanager</artifactId><version>4.3.10.Final</version></dependency>
    <dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.35</version></dependency>
</dependencies>

3. Java 核心代碼:圖操作 CRUD

public class TinkerPopMysqlDemo {
    private JpaGraph jpaGraph;

    @Before
    public void setUp() {
        Map<String, Object> props = new HashMap<>();
        props.put("javax.persistence.jdbc.driver", "com.mysql.jdbc.Driver");
        props.put("javax.persistence.jdbc.url", "jdbc:mysql://localhost:3306/tinkerpop?characterEncoding=UTF-8");
        props.put("javax.persistence.jdbc.user", "tinkerpop");
        props.put("javax.persistence.jdbc.password", "tinkerpop");
        jpaGraph = new JpaGraph("HibernateUnit", props); // 持久化單元名需與 persistence.xml 一致
    }

    @After
    public void tearDown() { jpaGraph.shutdown(); }

    @Test
    public void testCreate() {
        Vertex zhangsan = jpaGraph.addVertex(null);
        zhangsan.setProperty("name", "zhangsan");
        Vertex lisi = jpaGraph.addVertex(null);
        lisi.setProperty("name", "lisi");
        Vertex wangwu = jpaGraph.addVertex(null);
        wangwu.setProperty("name", "wangwu");

        // 建立邊: zhangsan --friend--> lisi, wangwu --friend--> lisi
        jpaGraph.addEdge(null, zhangsan, lisi, "friend");
        jpaGraph.addEdge(null, wangwu, lisi, "friend");
        System.out.println("Create finish");
    }

    @Test
    public void testQuery() {
        // 查詢所有頂點
        for (Vertex v : jpaGraph.getVertices()) {
            System.out.println("name: " + v.getProperty("name") + ", id: " + v.getId());
        }
        // 查詢張三的出向 friend 邊連接的頂點
        Vertex zhangsan = jpaGraph.getVertex(1L);
        for (Vertex friend : zhangsan.getVertices(Direction.OUT, "friend")) {
            System.out.println("Friend: " + friend.getProperty("name") + ", id: " + friend.getId());
        }
    }

    @Test
    public void testDelete() {
        Vertex lisi = jpaGraph.getVertex(2L);
        jpaGraph.removeVertex(lisi); // 級聯刪除關聯邊
        testQuery(); // 驗證剩餘數據
    }
}

4. 運行結果與數據庫表結構分析

執行後 MySQL 自動建表 (Hibernate hbm2ddl.auto=update):

mysql> SHOW TABLES;
+---------------------+
| Tables_in_tinkerpop |
+---------------------+
| ENTITY              |
| INDEX_BASE          |
+---------------------+

mysql> SELECT * FROM ENTITY;
+---------------+----+---------+---------+---------+-----------------+--------+------------+-------------------+-------------------+
| DTYPE         | id | REMOVED | VERSION | KEYNAME | valueData       | LABEL  | element_id | incomingVertex_id | outgoingVertex_id |
+---------------+----+---------+---------+---------+-----------------+--------+------------+-------------------+-------------------+
| BpJpaVertex   | 1  |       0 |       0 | NULL    | NULL            | NULL   | NULL       | NULL              | NULL              |
| BpJpaVertex   | 2  |       0 |       0 | NULL    | NULL            | NULL   | NULL       | NULL              | NULL              |
| BpJpaVertex   | 3  |       0 |       0 | NULL    | NULL            | NULL   | NULL       | NULL              | NULL              |
| BpJpaEdge     | 4  |       1 |       0 | NULL    | NULL            | friend | NULL       | 2                 | 1                 |
| BpJpaEdge     | 5  |       1 |       0 | NULL    | NULL            | friend | NULL       | 2                 | 3                 |
| BpJpaProperty | 6  |       0 |       0 | name    | [BLOB: lisi]    | NULL   | 2          | NULL              | NULL              |
| BpJpaProperty | 7  |       0 |       0 | name    | [BLOB: wangwu]  | NULL   | 3          | NULL              | NULL              |
| BpJpaProperty | 8  |       0 |       0 | name    | [BLOB: zhangsan]| NULL   | 1          | NULL              | NULL              |
+---------------+----+---------+---------+---------+-----------------+--------+------------+-------------------+-------------------+

表結構特點:單表 ENTITY 通過 DTYPE 區分 Vertex/Edge/Property,valueData 為 BLOB 存儲屬性值,外鍵關聯實現圖拓撲。優點是 Schema 固定、遷移簡單;缺點是大圖查詢需多次自關聯 Join,性能不如原生圖數據庫 (Neo4j、JanusGraph)。

5. 總結與選型建議

  • 適用場景:小規模圖數據、已有 MySQL 基礎設施、團隊熟悉 JPA、不想引入專用圖數據庫運維成本。
  • 局限性:單表設計隨數據增長 Join 開銷大;TinkerPop 3 早期孵化版本 API 不穩定;Blueprints JPA 實現非官方主流維護。
  • 替代方案:Neo4j (原生圖、Cypher、生產級);JanusGraph (分布式、支持 Cassandra/HBase/ES 後端);NebulaGraph (國產分布式圖)。

圖數據庫核心價值在於「關係即數據」,TinkerPop 提供統一抽象,選型時以業務規模、團隊能力、運維預算為準。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved