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=groovy

3. 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>