前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >hugegraph 支持sparql 与cypher

hugegraph 支持sparql 与cypher

作者头像
JadePeng
发布2020-11-24 15:38:30
8980
发布2020-11-24 15:38:30
举报
文章被收录于专栏:JadePeng的技术博客

hugegraph 是百度开源的基于tinkerpop的图数据库,支持通过gremlin进行查询。

这里,我们来扩展支持sparql 与cypher。

sparql支持

github上有SparqlToGremlinCompiler,可以支持将sparql转GraphTraversal,集成该工具库即可:

代码语言:javascript
复制
@Path("graphs/{graph}/sparql")
@Singleton
public class SparqlAPI extends API {

    private static final Logger LOG = Log.logger(SparqlAPI.class);

    @GET
    @Timed
    @CompressInterceptor.Compress
    @Produces(APPLICATION_JSON_WITH_CHARSET)
    public String query(@Context GraphManager manager,
                        @PathParam("graph") String graph,
                        @QueryParam("sparql") String sparql) {
        LOG.debug("Graph [{}] query by sparql: {}", graph, sparql);

        E.checkArgument(sparql != null && !sparql.isEmpty(),
                "The sparql parameter can't be null or empty");

        HugeGraph g = graph(manager, graph);
        GraphTraversal<Vertex, ?> traversal = SparqlToGremlinCompiler.convertToGremlinTraversal(g, sparql);
        List<?> result = traversal.toList();
        if (result.size() > 0) {
            Object item = result.get(0);
            if (item instanceof Vertex) {
                return manager.serializer(g).writeVertices((Iterator<Vertex>) result.iterator(), false);
            }
            if (item instanceof Map) {
                return manager.serializer(g).writeMap((Map) item);
            }
        }

        return result.toString();
    }
}

cypher 支持

opencypher 提供了translation包,支持将cypher转为gremlin:

代码语言:javascript
复制
        <dependency>
            <groupId>org.opencypher.gremlin</groupId>
            <artifactId>translation</artifactId>
            <version>1.0.4</version>
        </dependency>

转换代码:

代码语言:javascript
复制
 TranslationFacade cfog = new TranslationFacade();
 String gremlin = cfog.toGremlinGroovy(cypher);

增加api代码

代码语言:javascript
复制
     @GET
    @Timed
    @CompressInterceptor.Compress
    @Produces(APPLICATION_JSON_WITH_CHARSET)
    public Response query(@Context GraphManager manager,
                          @PathParam("graph") String graph,
                          @Context HugeConfig conf,
                          @Context HttpHeaders headers,
                          @QueryParam("cypher") String cypher) {
        LOG.debug("Graph [{}] query by cypher: {}", graph, cypher);

        return getResponse(graph, headers, cypher);
    }

    private Response getResponse(@PathParam("graph") String graph, @Context HttpHeaders headers, @QueryParam("cypher") String cypher) {
        E.checkArgument(cypher != null && !cypher.isEmpty(),
                "The cypher parameter can't be null or empty");

        TranslationFacade cfog = new TranslationFacade();
        String gremlin = cfog.toGremlinGroovy(cypher);
        gremlin = "g = " + graph + ".traversal()\n" + gremlin;
        String auth = headers.getHeaderString(HttpHeaders.AUTHORIZATION);
        MultivaluedMap<String, String> params = new MultivaluedHashMap<>();
        params.put("gremlin", Arrays.asList(gremlin));
        Response response = this.client().doGetRequest(auth, params);
        return transformResponseIfNeeded(response);
    }

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-11-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • sparql支持
  • cypher 支持
相关产品与服务
图数据库 KonisGraph
图数据库 KonisGraph(TencentDB for KonisGraph)是一种云端图数据库服务,基于腾讯在海量图数据上的实践经验,提供一站式海量图数据存储、管理、实时查询、计算、可视化分析能力;KonisGraph 支持属性图模型和 TinkerPop Gremlin 查询语言,能够帮助用户快速完成对图数据的建模、查询和可视化分析。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档