如何在 gremlin 中区分 select 和 add/update 查询?

How to differentiate select and add/update query in gremlin?

我有一个允许用户从 UI 推送 Gremlin 查询的应用程序,这些查询在后端 gremlin 服务器上执行。

我只想允许 select 查询。即任何 update/modify 现有图形的查询都不应被允许,而所有 return 不改变图形的查询都可以。

喜欢:

g.V().label()          //allowed
g.V(1).properties()    //allowed

g.V(1).property('name', 'new name')   // not allowed

我应该如何确定允许哪些查询,哪些不允许?

在服务器端防止突变的一种简单方法是在 Gremlin 服务器中配置 "g" ReadOnlyStrategy。在 conf/gremlin-server-modern-readonly.yaml 中的默认 Gremlin 服务器分发中可以找到此方法的示例。兴趣线是 here which uses the initialization script of scripts/generate-modern-readonly.groovy (here) - 它的要点是:

def globals = [:]

... 

globals << [g : graph.traversal().withStrategies(ReadOnlyStrategy.instance(), ReferenceElementStrategy.instance())]