我可以编写一个 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 中编写遍历才能实现此目的?

当然可以。你可以在Neo4j中做任何事情。只需在接收 post 请求的非托管扩展中获取密码字符串,以您想要的任何方式更改它,使用 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();
}

目前无法扩展或修改 Cypher 查询。

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

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

最新更新