package org.neo4j.shell.tools.imp;
import org.neo4j.cypher.export.CypherResultSubGraph;
import org.neo4j.cypher.export.DatabaseSubGraph;
import org.neo4j.cypher.export.SubGraph;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction;
import org.neo4j.shell.*;
import org.neo4j.shell.impl.AbstractApp;
import org.neo4j.shell.kernel.GraphDatabaseShellServer;
import org.neo4j.shell.tools.imp.format.MultiStatementCypherSubGraphExporter;
import org.neo4j.shell.tools.imp.util.Config;
import org.neo4j.shell.tools.imp.util.ProgressReporter;
import java.io.*;
import static org.neo4j.shell.tools.imp.util.FileUtils.getPrintWriter;
public class ExportCypherApp extends AbstractApp {
{
addOptionDefinition( "o", new OptionDefinition( OptionValueType.MUST,
"Output Cypher file" ) );
addOptionDefinition("b", new OptionDefinition(OptionValueType.MUST,
"Batch Size default " + Config.DEFAULT_BATCH_SIZE));
addOptionDefinition( "r", new OptionDefinition( OptionValueType.MAY,
"Add all nodes of selected relationships" ) );
}
@Override
public String getName() {
return "export-cypher";
}
@Override
public GraphDatabaseShellServer getServer() {
return (GraphDatabaseShellServer) super.getServer();
}
private SubGraph cypherResultSubGraph(String query, boolean relsBetween) {
GraphDatabaseService db = getServer().getDb();
try (Transaction tx = db.beginTx()) {
Result result = db.execute(query);
SubGraph subGraph = CypherResultSubGraph.from(result, db, relsBetween);
tx.success();
return subGraph;
}
}
@Override
public Continuation execute(AppCommandParser parser, Session session, Output out) throws Exception {
Config config = Config.fromOptions(parser);
boolean relsBetween = parser.options().containsKey("r");
ProgressReporter reporter = new ProgressReporter(null, out);
GraphDatabaseService db = getServer().getDb();
String query = Config.extractQuery(parser);
SubGraph graph = query.isEmpty() ? new DatabaseSubGraph(db) : cypherResultSubGraph(query,relsBetween);
String fileName = parser.option("o", null);
try (Transaction tx = db.beginTx();PrintWriter printWriter = getPrintWriter(fileName, out)) {
MultiStatementCypherSubGraphExporter exporter = new MultiStatementCypherSubGraphExporter(graph);
exporter.export(printWriter, config.getBatchSize(), reporter);
tx.success();
}
reporter.progress("Wrote to Cypher-file " + fileName);
return Continuation.INPUT_COMPLETE;
}
}