hugegraph 支持sparql 與cypher

hugegraph 是百度開源的基於tinkerpop的圖數據庫,支持通過gremlin進行查詢。

這裏,我們來擴展支持sparql 與cypher。

sparql支持

github上有SparqlToGremlinCompiler,可以支持將sparql轉GraphTraversal,集成該工具庫即可:

@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:

        <dependency>
            <groupId>org.opencypher.gremlin</groupId>
            <artifactId>translation</artifactId>
            <version>1.0.4</version>
        </dependency>

轉換代碼:

 TranslationFacade cfog = new TranslationFacade();
 String gremlin = cfog.toGremlinGroovy(cypher);

增加api代碼

     @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);
    }

作者:Jadepeng
出處:jqpeng的技術記事本--http://www.cnblogs.com/xiaoqi
您的支持是對博主最大的鼓勵,感謝您的認真閱讀。
本文版權歸作者所有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章