Table of Contents
1. Description
Executes arbitrary groovy script
2. Connection
2.1. Attributes
There are no special attributes supported for this driver.
2.2. Parameters
The only parameter is “language”:
language=groovy3. Query
Executes the Groovy query. Used for the read statements.
The entire code should be enclosed in <![CDATA[ ]]> element.
In order to proceed to the next query processor use:
query.next()You can use any <script> in the body of the query to process every record returned by the query one by one. The easiest way to return/forward current entry into another subquery/script is to use etl.globals object, for example:
etl.globals['my_value'] = "some value"In order to use results from the previous <query> element, use:
etl.getParameter('name_of_property')4. Script
Executes any read or write statements. Used mainly for "write" statements.
5. Examples
Query example: Reads a Graphson document, parses each vertex into a HashMap, and processes the entries one by one. After that, it parses each edge into a HashMap and processes the entries one by one.
<!DOCTYPE etl SYSTEM "https://scriptella.org/dtd/etl.dtd"> <etl> <description>Graphlytic job</description> <properties> job_name=Graphlytic job </properties> <!-- CONNECTIONS --> <connection id="graphdb" driver="graphConnection"> project_id=1 </connection> <connection id="groovy" driver="script">language=groovy</connection> <connection id="logInfo" driver="log"> level=INFO </connection> <!-- JOB STEPS --> <script connection-id="logInfo"> STARTING JOB "$job_name" </script> <!-- CLEAR DB PRIOR TO IMPORT --> <script connection-id="graphdb"> MATCH (n) DETACH DELETE n </script> <query connection-id="groovy"> <![CDATA[ import com.fasterxml.jackson.databind.JsonNode import com.fasterxml.jackson.databind.ObjectMapper import com.fasterxml.jackson.core.type.TypeReference import java.nio.file.Files import java.nio.file.Paths java.nio.file.Path path = java.nio.file.Paths.get("C:/path/to/data/dataset.graphson") String jsonData = new String(Files.readAllBytes(path), "UTF-8") ObjectMapper mapper = new ObjectMapper(); JsonNode tree = mapper.readTree(jsonData); if (tree.has("vertices")) { tree.get("vertices").elements().forEachRemaining((entity)-> { etl.globals['isEdge'] = false; etl.globals['entity'] = mapper.convertValue( entity, new TypeReference<Map<String, Object>>(){} ); query.next() }); } if (tree.has("edges")) { tree.get("edges").elements().forEachRemaining((entity)-> { etl.globals['isEdge'] = true; etl.globals['entity'] = mapper.convertValue( entity, new TypeReference<Map<String, Object>>(){} ); query.next(); }); } ]]> <script connection-id="logInfo" if="etl.globals['isEdge'] == false"> Importing VERTEX ${etl.globals['entity']}; </script> <script connection-id="graphdb" if="etl.globals['isEdge'] == false"> CREATE (n:IMPORTED { name: '${etl.globals['entity']['name']}', age: ${etl.globals['entity']['age']}, uid: '${etl.globals['entity']['_id']}' }) RETURN n </script> <script connection-id="logInfo" if="etl.globals['isEdge'] == true"> Importing EDGE ${etl.globals['entity']}; </script> <script connection-id="graphdb" if="etl.globals['isEdge'] == true"> MATCH (n), (m) WHERE n.uid='${etl.globals['entity']['_outV']}' and m.uid='${etl.globals['entity']['_inV']}' CREATE (m)-[r:${etl.globals['entity']['_label']}]->(n) RETURN n,r,m </script> </query></etl>