0
votes

We are trying to apply a static filter based on user permission pre-set on the vertices as property.

Need some help in order to achieve the #4 and #5

Approach: 1. Implement a gremlin proxy service (Java REST layer) enabling the SubgraphStrategy to create the GraphTraversalSource i.e. g on every request.

2. extract the user principle and invoke our entitlement service to get all the permissions.

3. use these user permissions to create a new GraphTraversalSource (g2) with SubgraphStrategy

4. Use this 'g2' to submit the requested gremlin query string to Gremlin server i.e. client.submit(queryString). // is it possible?? how can we override the 'g' used in queryString with the new 'g2'

5. Response should be in JSON (GraphSON) the same way gremlin server responds (Http response). How can we produce the similar JSON from the ResultSet.

code snippet: remote-objects.yaml (used to connect to gremlin server remotely via java)

hosts: [localhost]
port: 8183
serializer: { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}

// Should we change anything at this serializer? in order to serialize the server response in GraphSON?

gremlin-server.yaml

host: 0.0.0.0
port: 8183
threadPoolWorker: 1
gremlinPool: 8
scriptEvaluationTimeout: 30000
serializedResponseTimeout: 30000
#channelizer: org.apache.tinkerpop.gremlin.server.channel.HttpChannelizer
channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer
graphs: {
  graph: "H:\\project_work\\Gremlin-Graph\\src\\main\\resources\\janusgraph-cassandra-es.properties" }
scriptEngines: {
 gremlin-groovy: {
      plugins: { org.janusgraph.graphdb.tinkerpop.plugin.JanusGraphGremlinPlugin: {},
                 org.apache.tinkerpop.gremlin.server.jsr223.GremlinServerGremlinPlugin: {},
                 org.apache.tinkerpop.gremlin.tinkergraph.jsr223.TinkerGraphGremlinPlugin: {},
                 org.apache.tinkerpop.gremlin.jsr223.ImportGremlinPlugin: {classImports: [java.lang.Math], methodImports: [java.lang.Math#*]},
                 org.apache.tinkerpop.gremlin.jsr223.ScriptFileGremlinPlugin: {
                 files: ["H:\\project_work\\Gremlin-Graph\\src\\main\\resources\\empty-sample.groovy"]
                 }}
   }
}
serializers:
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoLiteMessageSerializerV1d0, config: {ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GryoMessageSerializerV1d0, config: { serializeResultToString: true }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerGremlinV2d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
  - { className: org.apache.tinkerpop.gremlin.driver.ser.GraphSONMessageSerializerV1d0, config: { ioRegistries: [org.janusgraph.graphdb.tinkerpop.JanusGraphIoRegistry] }}
processors:
  - { className: org.apache.tinkerpop.gremlin.server.op.session.SessionOpProcessor, config: { sessionTimeout: 28800000 }}
  - { className: org.apache.tinkerpop.gremlin.server.op.traversal.TraversalOpProcessor, config: { cacheExpirationTime: 600000, cacheMaxSize: 1000 }}
metrics: {
  consoleReporter: {enabled: true, interval: 180000},
  csvReporter: {enabled: true, interval: 180000, fileName: /tmp/gremlin-server-metrics.csv},
  jmxReporter: {enabled: true},
  slf4jReporter: {enabled: true, interval: 180000},
  gangliaReporter: {enabled: false, interval: 180000, addressingMode: MULTICAST},
  graphiteReporter: {enabled: false, interval: 180000}}
threadPoolBoss: 1
maxInitialLineLength: 4096
maxHeaderSize: 8192
maxChunkSize: 8192
maxContentLength: 65536
maxAccumulationBufferComponents: 1024
resultIterationBatchSize: 64
writeBufferHighWaterMark: 32768
writeBufferHighWaterMark: 65536
ssl: {
  enabled: false}

janusgraph-cassandra-es.properties

gremlin.graph=org.janusgraph.core.JanusGraphFactory

storage.backend=cql
storage.hostname=1.2.3.4,1.2.3.5,1.2.3.6,1.2.3.7,1.2.3.8,1.2.3.9
storage.username=username
storage.password=password
storage.read-time=20000 ms
storage.cql.keyspace=janusgraph_dev
storage.cql.read-consistency-level=LOCAL_QUORUM
storage.cql.write-consistency-level=LOCAL_QUORUM
storage.cql.local-datacenter=dc1
storage.cql.only-use-local-consistency-for-system-operations=true
storage.cql.replication-strategy-options=dc1,2,dc2,2
storage.cql.replication-strategy-class=NetworkTopologyStrategy
log.tx.key-consistent=true

index.search.backend=elasticsearch
index.search.index-name=graph_search_cs_dev
index.search.hostname=dev.elastic.service.com
index.search.elasticsearch.http.auth.type=custom
index.search.elasticsearch.http.auth.custom.authenticator-class=edu.sample.cassandra.graph.Authenticator
index.search.elasticsearch.http.auth.custom.authenticator-args=keytabUser,H:\\keytabs\\keytab-file.kt

empty-sample.groovy is the default used here:

https://github.com/JanusGraph/janusgraph/blob/master/janusgraph-dist/src/assembly/static/scripts/empty-sample.groovy

Java REST layer (Gremlin Proxy Service)

GET /gremlin-proxy?gremlin=g.V().has('name', 'stephane').out()


Cluster cluster = Cluster.open("H:\\project_work\\Gremlin-Graph\\src\\main\\resources\\remote-objects.yaml");
Client client = cluster.connect();
Graph graph = EmptyGraph.instance();
GraphTraversalSource g2 = graph.traversal()
.withRemote(DriverRemoteConnection.using(cluster, "g"))
.withStrategies(SubgraphStrategy.build().vertices(has("p_entitlements",textContains("edu.sample.graph.team2"))).create());


String queryString = "g.V().has('uri', 'http://sample.com/sample/sample_2').out()"; *// user requested query string. Is it possible to replace this 'g' with the new GraphTraversalSource i.e. 'g2' for the server to use and execute.*

ResultSet rs = client.submit(queryString);

System.out.println(rs);

List<Result> results = rs.all().get();  *// Unsure how we can convert this to GraphSON like gremlin server response in JSON*

System.out.println(results);

g.close();
client.close();
cluster.close();

Any reference or pointers would very helpful.

1

1 Answers

1
votes

You can't overwrite g in the ways you are describing. I can think of two options:

  1. Use a session, construct g as you wish and then reference that g in that session, OR
  2. Build your query string with the SubgraphStrategy code for each request. That should not be a terribly expensive operation in my mind if you had to do it.