1. HugeGraph不仅开源开放,而且要做到简单易用,一般用户无需更改源码也能轻松增加插件扩展功能。
    2. HugeGraph支持多种内置存储后端,也允许用户无需更改现有源码的情况下扩展自定义后端。
    3. HugeGraph支持全文检索,全文检索功能涉及到各语言分词,目前已内置8种中文分词器,也允许用户无需更改现有源码的情况下扩展自定义分词器。
    • 后端存储
    • 序列化器
    • 自定义配置项
    • 分词器
    1. HugeGraph提供插件接口HugeGraphPlugin,通过Java SPI机制支持插件化
    2. HugeGraph提供了4个扩展项注册函数:registerOptions()registerBackend()registerSerializer()registerAnalyzer()
    3. 插件实现者实现相应的Options、Backend、Serializer或Analyzer的接口
    4. 插件实现者实现HugeGraphPlugin接口的register()方法,在该方法中注册上述第3点所列的具体实现类,并打成jar包
    5. 插件使用者将jar包放在HugeGraph Server安装目录的plugins目录下,修改相关配置项为插件自定义值,重启即可生效

    1 新建一个maven项目

    1.1 项目名称取名:hugegraph-plugin-demo
    1.2 添加hugegraph-core Jar包依赖

    maven pom.xml详细内容如下:

    2 实现扩展功能

    2.1 扩展自定义后端
    2.1.1 实现接口BackendStoreProvider
    • 可实现接口:com.baidu.hugegraph.backend.store.BackendStoreProvider
    • 或者继承抽象类:com.baidu.hugegraph.backend.store.AbstractBackendStoreProvider

    以RocksDB后端RocksDBStoreProvider为例:

    1. public class RocksDBStoreProvider extends AbstractBackendStoreProvider {
    2. protected String database() {
    3. return this.graph().toLowerCase();
    4. }
    5. @Override
    6. protected BackendStore newSchemaStore(String store) {
    7. }
    8. @Override
    9. protected BackendStore newGraphStore(String store) {
    10. return new RocksDBGraphStore(this, this.database(), store);
    11. }
    12. @Override
    13. public String type() {
    14. return "rocksdb";
    15. }
    16. @Override
    17. public String version() {
    18. }
    19. }
    2.1.2 实现接口BackendStore

    BackendStore接口定义如下:

    2.1.3 扩展自定义序列化器
    1. public interface GraphSerializer {
    2. public BackendEntry writeVertex(HugeVertex vertex);
    3. public BackendEntry writeVertexProperty(HugeVertexProperty<?> prop);
    4. public HugeVertex readVertex(HugeGraph graph, BackendEntry entry);
    5. public BackendEntry writeEdge(HugeEdge edge);
    6. public BackendEntry writeEdgeProperty(HugeEdgeProperty<?> prop);
    7. public HugeEdge readEdge(HugeGraph graph, BackendEntry entry);
    8. public BackendEntry writeIndex(HugeIndex index);
    9. public HugeIndex readIndex(HugeGraph graph, ConditionQuery query, BackendEntry entry);
    10. public BackendEntry writeId(HugeType type, Id id);
    11. public Query writeQuery(Query query);
    12. }
    13. public interface SchemaSerializer {
    14. public BackendEntry writeVertexLabel(VertexLabel vertexLabel);
    15. public VertexLabel readVertexLabel(HugeGraph graph, BackendEntry entry);
    16. public BackendEntry writeEdgeLabel(EdgeLabel edgeLabel);
    17. public EdgeLabel readEdgeLabel(HugeGraph graph, BackendEntry entry);
    18. public BackendEntry writePropertyKey(PropertyKey propertyKey);
    19. public PropertyKey readPropertyKey(HugeGraph graph, BackendEntry entry);
    20. public BackendEntry writeIndexLabel(IndexLabel indexLabel);
    21. public IndexLabel readIndexLabel(HugeGraph graph, BackendEntry entry);
    2.1.4 扩展自定义配置项

    增加自定义后端时,可能需要增加新的配置项,实现流程主要包括:

    • 增加配置项容器类,并实现接口com.baidu.hugegraph.config.OptionHolder
    • 提供单例方法public static OptionHolder instance(),并在对象初始化时调用方法OptionHolder.registerOptions()
    • 增加配置项声明,单值配置项类型为ConfigOption、多值配置项类型为ConfigListOption

    以RocksDB配置项定义为例:

    2.2 扩展自定义分词器

    分词器需要实现接口,以实现一个SpaceAnalyzer空格分词器为例。

    1. package com.baidu.hugegraph.plugin;
    2. import java.util.Arrays;
    3. import java.util.HashSet;
    4. import java.util.Set;
    5. import com.baidu.hugegraph.analyzer.Analyzer;
    6. public class SpaceAnalyzer implements Analyzer {
    7. @Override
    8. public Set<String> segment(String text) {
    9. return new HashSet<>(Arrays.asList(text.split(" ")));
    10. }
    11. }

    3 实现插件接口,并进行注册

    并且HugeGraphPlugin提供了4个静态方法用于注册扩展项:

    • registerOptions(String name, String classPath):注册配置项
    • registerBackend(String name, String classPath):注册后端(BackendStoreProvider)
    • registerSerializer(String name, String classPath):注册序列化器
    • registerAnalyzer(String name, String classPath):注册分词器

    下面以注册SpaceAnalyzer分词器为例:

    1. package com.baidu.hugegraph.plugin;
    2. public class DemoPlugin implements HugeGraphPlugin {
    3. @Override
    4. public String name() {
    5. return "demo";
    6. }
    7. @Override
    8. public void register() {
    9. HugeGraphPlugin.registerAnalyzer("demo", SpaceAnalyzer.class.getName());
    10. }
    11. }

    4 配置SPI入口

    1. 确保services目录存在:hugegraph-plugin-demo/resources/META-INF/services
    2. 在services目录下建立文本文件:com.baidu.hugegraph.plugin.HugeGraphPlugin
    3. 文件内容如下:com.baidu.hugegraph.plugin.DemoPlugin

    5 打Jar包

    通过maven打包,在项目目录下执行命令mvn package,在target目录下会生成Jar包文件。 使用时将该Jar包拷到目录,重启服务即可生效。