我可以编写一个Neo4j插件来拦截和修改CYPHER查询

时间:2016-02-08 13:36:08

标签: neo4j cypher

在我的系统中,我想拦截并更改Cypher查询,因为它们是一个替代方法是在将它们从我的中间层发送到图形之前修改它们 - 但有没有办法让插件进行转换对我来说,图表本身?

我想做一些以下事情: 如果有人认定自己是A组的成员,想象一下我想改变他们的请求:

MATCH(f:Film)-[r:REVIEWED_BY]-(u:User {id:"1337"})

为:

MATCH(p:Product)-[p:PURCHASED_BY]-(u:User {id:"1337"})

这样的事情可能吗?或者我是否必须直接用Java编写遍历才能实现这一目标?

2 个答案:

答案 0 :(得分:3)

当然可以。你可以在Neo4j做任何事情。只需在接收post请求的非托管扩展中获取cypher字符串,以任何方式更改它,使用graphdb.execute方法执行它并正常返回结果。

@POST
@Path("/batch")
public Response alterCypher(String body, @Context GraphDatabaseService db) throws IOException, InterruptedException {

    ArrayList<Result> results = new ArrayList<>();
    // Validate our input or exit right away
    HashMap input = Validators.getValidCypherStatements(body);
    ArrayList<HashMap> statements = (ArrayList<HashMap>)input.get("statements");
    for (HashMap statement : statements) {
        // write the alterQuery method to change the queries.
        String alteredQuery = alterQuery((String)statement.get("statement"));
        Result result = db.execute(alteredQuery, (Map)statement.getOrDefault("parameters", new HashMap<>()));
        results.add(result);
    }
    // or go the results and return them however you want 
    // see https://github.com/dmontag/neo4j-unmanaged-extension-template/blob/master/src/main/java/org/neo4j/example/unmanagedextension/MyService.java#L36
    return Response.ok().build();
}

答案 1 :(得分:1)

此时无法扩展或修改Cypher查询。

如果您需要,我建议您使用事务事件API - http://graphaware.com/neo4j/transactions/2014/07/11/neo4j-transaction-event-api.html

有了这个,您应该能够更改查询返回的内容。