我想知道标题的内容。
我想要这个的原因是允许执行受限制的只读密码查询;稍后将通过单独的API层解释和序列化数据结果。
我已经看到代码在做出基本假设时试图模仿这种行为,例如:代码可能会过滤掉任何包含与写查询结构相关的特殊单词的Cypher查询(merge
,create
,delete
,set
等等。
这种方法往往有限且天真;如果它只是寻找那些令牌,它会阻止像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();
}
这里的想法是,如果查询发生在事务中并且事务总是强制失败,那么无论结果如何,都不能将任何内容写入数据库。
答案 0 :(得分:1)
只读(尚未)直接支持Cypher。但是我可以想到两个解决方法:
1)假设您正在运行Neo4j企业集群:您可以在一个实例上设置read_only=true
。然后,该实例用于只读查询,其他集群实例用于r / w。可以设置群集前面的负载平衡器将请求发送到正确的实例。
2)如果事务TransactionEventHandler
包含写操作,请使用对事务进行审查的TransactionData
。为了好玩,我花了一些时间来实现它,请参阅https://github.com/sarmbruster/read-only-cypher - 感谢您的反馈。