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.kernel.internal.GraphDatabaseAPI; import org.neo4j.shell.*; import org.neo4j.shell.impl.AbstractApp; import org.neo4j.shell.kernel.GraphDatabaseShellServer; import org.neo4j.shell.tools.imp.format.Format; import org.neo4j.shell.tools.imp.format.XmlGraphMLFormat; import org.neo4j.shell.tools.imp.util.Config; import org.neo4j.shell.tools.imp.util.FileUtils; import org.neo4j.shell.tools.imp.util.ProgressReporter; import java.io.BufferedWriter; import java.io.FileWriter; import java.io.Writer; /** * TODO: arrays, labels, rel-types, key-types * @author mh * @since 17.01.14 */ public class ExportGraphMLApp extends AbstractApp { { addOptionDefinition( "o", new OptionDefinition( OptionValueType.MUST, "Output GraphML file" ) ); addOptionDefinition( "t", new OptionDefinition( OptionValueType.MAY, "Write key types upfront (double pass)" ) ); addOptionDefinition( "r", new OptionDefinition( OptionValueType.MAY, "Add all nodes of selected relationships" ) ); } @Override public String getName() { return "export-graphml"; } @Override public GraphDatabaseShellServer getServer() { return (GraphDatabaseShellServer) super.getServer(); } private SubGraph cypherResultSubGraph(String query, boolean relsBetween) { GraphDatabaseAPI 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); String fileName = parser.option("o", null); boolean relsBetween = parser.options().containsKey("r"); Writer writer = FileUtils.getPrintWriter(fileName,out); ProgressReporter reporter = new ProgressReporter(null, out); GraphDatabaseService db = getServer().getDb(); Format exportFormat = new XmlGraphMLFormat(db); String query = Config.extractQuery(parser); SubGraph graph = query.isEmpty() ? new DatabaseSubGraph(db) : cypherResultSubGraph(query,relsBetween); exportFormat.dump(graph, writer, reporter, config); writer.close(); reporter.progress("Wrote to GraphML-file " + fileName); return Continuation.INPUT_COMPLETE; } }