0

I am trying to play Gremlin Server from Moqui. I added channelizer: org.apache.tinkerpop.gremlin.server.channel.WsAndHttpChannelizer to gremlin-server-modern.yaml, then started the server by gremlin-server.bat conf/gremlin-server-modern.yaml

Now by rest call:

<set field="requestMap" from="[gremlin:'g.V().has(p0,p1).out(p2).toList()', bindings:[p0:'name', p1:'marko', p2:'knows']]"/>
<script><![CDATA[
                org.moqui.util.RestClient restClient = ec.service.rest().method(org.moqui.util.RestClient.POST)
                        .addHeader("Content-Type", "application/json").jsonObject(requestMap)
                    restClient.uri().protocol("http").host("localhost").port(8182).build()
                org.moqui.util.RestClient.RestResponse restResponse = restClient.call()
                if (restResponse.statusCode < 200 || restResponse.statusCode >= 300) {
                    String errMsg = restResponse.text()
                    ec.logger.error("Rest Call to Gremlin Server Error (${restResponse.statusCode}): ${errMsg}")
                    ec.message.addMessage("Rest Call to Gremlin Server Error:")
                    ec.message.addMessage(errMsg)
                    return
                }
                responseMap = restResponse.jsonObject()
                ]]>
</script>
<set field="list" from="responseMap"/>

I can get correct response.

Tinkerpop recommends WebSocket call rather than Rest, according to Groovy part of this: http://tinkerpop.apache.org/docs/current/reference/#connecting-via-drivers

def g = traversal().withRemote(DriverRemoteConnection.using("localhost",8182,"g"))
def list = g.V().has('person','name','marko').out('knows').toList()

I then coded in Moqui actions:

<script>
      import org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.GraphTraversalSource
      import org.apache.tinkerpop.gremlin.process.traversal.IO
      import static org.apache.tinkerpop.gremlin.process.traversal.AnonymousTraversalSource.traversal
      import static org.apache.tinkerpop.gremlin.process.traversal.Operator.*
      import static org.apache.tinkerpop.gremlin.process.traversal.Order.*
      import static org.apache.tinkerpop.gremlin.process.traversal.P.*
      import static org.apache.tinkerpop.gremlin.process.traversal.Pop.*
      import static org.apache.tinkerpop.gremlin.process.traversal.SackFunctions.*
      import static org.apache.tinkerpop.gremlin.process.traversal.Scope.*
      import static org.apache.tinkerpop.gremlin.process.traversal.TextP.*
      import static org.apache.tinkerpop.gremlin.structure.Column.*
      import static org.apache.tinkerpop.gremlin.structure.Direction.*
      import static org.apache.tinkerpop.gremlin.structure.T.*
      import static org.apache.tinkerpop.gremlin.process.traversal.dsl.graph.__.*

      def g = traversal().withRemote(DriverRemoteConnection.using("localhost",8182,"g"))
      def responseMap = g.V().has('person','name','marko').out('knows').toList()
</script>
<set field="list" from="responseMap"/>

Just got error: "Cannot invoke method using() on null object\n"

I already have

dependencies {
compile project(':framework')
compile group: 'org.apache.tinkerpop', name: 'gremlin-core', version: '3.4.2'
compile group: 'org.apache.tinkerpop', name: 'gremlin-driver', version: '3.4.2'
}

in build.gradle.

Can anyone advise where is wrong in my code? Thanks.

Teddy
  • 35
  • 8
  • You might need to import DriverRemoteConnection. Without the import, it's seeing it as a variable name – tim_yates Jul 21 '19 at 10:46
  • Thanks. Added import static org.apache.tinkerpop.gremlin.process.remote.RemoteConnection.* or import static org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection.*, still no luck – Teddy Jul 21 '19 at 11:44
  • Just `import org.apache.tinkerpop.gremlin.driver.remote.DriverRemoteConnection` should do it – tim_yates Jul 21 '19 at 11:55
  • still the same error – Teddy Jul 21 '19 at 13:19

0 Answers0