是否可以从java执行只读密码查询?

时间:2015-03-12 19:01:29

标签: neo4j cypher

我想知道标题的内容。

我想要这个的原因是允许执行受限制的只读密码查询;稍后将通过单独的API层解释和序列化数据结果。

我已经看到代码在做出基本假设时试图模仿这种行为,例如:代码可能会过滤掉任何包含与写查询结构相关的特殊单词的Cypher查询(mergecreatedeleteset等等。

这种方法往往有限且天真;如果它只是寻找那些令牌,它会阻止像MATCH n WHERE n.label =~ '.*create.*' RETURN n这样的查询,即使它是一个只读查询。

我真的不想对候选查询进行全面解析,然后通过AST试图找出某些内容是否为只读(尽管我很乐意接受一个显示如何执行此操作的答案很容易在java)

编辑 - 我知道可以通过配置属性read_only=true以只读模式启动整个数据库,但这是不可取的;没有java API的其他方面可以更改数据库。

编辑2 - 我发现了另一种可能的策略,但我不确定它的可行性。欢迎提出这方面的意见,以及潜在的缺点:

try (Transaction ignore = graphDb.beginTx()) {
    ExecutionResult result = executionEngine.execute(query);
    // Do nifty stuff with result, then...

    // Force transaction to fail.
    ignore.failure();
}

这里的想法是,如果查询发生在事务中并且事务总是强制失败,那么无论结果如何,都不能将任何内容写入数据库。

1 个答案:

答案 0 :(得分:1)

只读(尚未)直接支持Cypher。但是我可以想到两个解决方法:

1)假设您正在运行Neo4j企业集群:您可以在一个实例上设置read_only=true。然后,该实例用于只读查询,其他集群实例用于r / w。可以设置群集前面的负载平衡器将请求发送到正确的实例。

2)如果事务TransactionEventHandler包含写操作,请使用对事务进行审查的TransactionData。为了好玩,我花了一些时间来实现它,请参阅https://github.com/sarmbruster/read-only-cypher - 感谢您的反馈。