Skip to content

Commit

Permalink
Fixes #1449: Possible bug in apoc graphml export (#1638)
Browse files Browse the repository at this point in the history
* fixes #1449: Possible bug in apoc graphml export

* fixes #1449: Possible bug in apoc graphml export
  • Loading branch information
vga91 committed Sep 24, 2020
1 parent 7529a42 commit 13f6798
Show file tree
Hide file tree
Showing 2 changed files with 32 additions and 6 deletions.
Expand Up @@ -43,7 +43,7 @@ private void writeKey(XMLStreamWriter writer, SubGraph ops, ExportConfig config)
Map<String, Class> keyTypes = new HashMap<>();
for (Node node : ops.getNodes()) {
if (node.getLabels().iterator().hasNext()) {
keyTypes.put("label", String.class);
keyTypes.put("labels", String.class);
}
updateKeyTypes(keyTypes, node);
}
Expand Down
36 changes: 31 additions & 5 deletions core/src/test/java/apoc/export/graphml/ExportGraphMLTest.java
Expand Up @@ -47,27 +47,29 @@ public class ExportGraphMLTest {

public static final String KEY_TYPES_EMPTY = "<key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>%n" +
"<key id=\"limit\" for=\"node\" attr.name=\"limit\" attr.type=\"long\"/>%n" +
"<key id=\"label\" for=\"node\" attr.name=\"label\" attr.type=\"string\"/>%n";
"<key id=\"labels\" for=\"node\" attr.name=\"labels\" attr.type=\"string\"/>%n";
public static final String GRAPH = "<graph id=\"G\" edgedefault=\"directed\">%n";
public static final String HEADER = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>%n" +
"<graphml xmlns=\"http://graphml.graphdrawing.org/xmlns\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://graphml.graphdrawing.org/xmlns http://graphml.graphdrawing.org/xmlns/1.0/graphml.xsd\">%n";
public static final String KEY_TYPES_FALSE = "<key id=\"born\" for=\"node\" attr.name=\"born\"/>%n" +
"<key id=\"values\" for=\"node\" attr.name=\"values\"/>%n" +
"<key id=\"name\" for=\"node\" attr.name=\"name\"/>%n" +
"<key id=\"label\" for=\"node\" attr.name=\"label\"/>%n"+
"<key id=\"labels\" for=\"node\" attr.name=\"labels\"/>%n"+
"<key id=\"place\" for=\"node\" attr.name=\"place\"/>%n" +
"<key id=\"age\" for=\"node\" attr.name=\"age\"/>%n" +
"<key id=\"label\" for=\"edge\" attr.name=\"label\"/>%n";
public static final String KEY_TYPES_DATA = "<key id=\"name\" for=\"node\" attr.name=\"name\"/>\n" +
"<key id=\"labels\" for=\"node\" attr.name=\"labels\"/>";
public static final String KEY_TYPES = "<key id=\"born\" for=\"node\" attr.name=\"born\" attr.type=\"string\"/>%n" +
"<key id=\"values\" for=\"node\" attr.name=\"values\" attr.type=\"string\" attr.list=\"long\"/>%n" +
"<key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>%n" +
"<key id=\"label\" for=\"node\" attr.name=\"label\" attr.type=\"string\"/>%n"+
"<key id=\"labels\" for=\"node\" attr.name=\"labels\" attr.type=\"string\"/>%n"+
"<key id=\"place\" for=\"node\" attr.name=\"place\" attr.type=\"string\"/>%n" +
"<key id=\"age\" for=\"node\" attr.name=\"age\" attr.type=\"long\"/>%n" +
"<key id=\"label\" for=\"edge\" attr.name=\"label\" attr.type=\"string\"/>%n";
public static final String KEY_TYPES_PATH = "<key id=\"born\" for=\"node\" attr.name=\"born\" attr.type=\"string\"/>%n" +
"<key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>%n" +
"<key id=\"label\" for=\"node\" attr.name=\"label\" attr.type=\"string\"/>%n"+
"<key id=\"labels\" for=\"node\" attr.name=\"labels\" attr.type=\"string\"/>%n"+
"<key id=\"place\" for=\"node\" attr.name=\"place\" attr.type=\"string\"/>%n" +
"<key id=\"TYPE\" for=\"node\" attr.name=\"TYPE\" attr.type=\"string\"/>%n" +
"<key id=\"age\" for=\"node\" attr.name=\"age\" attr.type=\"long\"/>%n" +
Expand All @@ -76,7 +78,7 @@ public class ExportGraphMLTest {
public static final String KEY_TYPES_CAMEL_CASE = "<key id=\"firstName\" for=\"node\" attr.name=\"firstName\" attr.type=\"string\"/>%n" +
"<key id=\"ageNow\" for=\"node\" attr.name=\"ageNow\" attr.type=\"long\"/>%n" +
"<key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"/>%n" +
"<key id=\"label\" for=\"node\" attr.name=\"label\" attr.type=\"string\"/>%n" +
"<key id=\"labels\" for=\"node\" attr.name=\"labels\" attr.type=\"string\"/>%n" +
"<key id=\"TYPE\" for=\"node\" attr.name=\"TYPE\" attr.type=\"string\"/>%n" +
"<key id=\"label\" for=\"edge\" attr.name=\"label\" attr.type=\"string\"/>%n" +
"<key id=\"TYPE\" for=\"edge\" attr.name=\"TYPE\" attr.type=\"string\"/>%n";
Expand Down Expand Up @@ -122,12 +124,16 @@ public class ExportGraphMLTest {
"<node id=\"n1\" labels=\":Bar\"><data key=\"TYPE\">:Bar</data><data key=\"label\">42</data><data key=\"age\">42</data><data key=\"name\">bar</data><data key=\"place\">{\"crs\":\"wgs-84\",\"latitude\":56.7,\"longitude\":12.78,\"height\":null}</data></node>%n" +
"<edge id=\"e0\" source=\"n0\" target=\"n1\" label=\"KNOWS\"><data key=\"label\">KNOWS</data><data key=\"TYPE\">KNOWS</data></edge>%n";

public static final String DATA_DATA = "<node id=\"n3\" labels=\":Person\"><data key=\"labels\">:Person</data><data key=\"name\">Foo</data></node>\n" +
"<node id=\"n5\" labels=\":Person\"><data key=\"labels\">:Person</data><data key=\"name\">Foo0</data></node>\n";

private static final String EXPECTED_TYPES_PATH = String.format(HEADER + KEY_TYPES_PATH + GRAPH + DATA_PATH + FOOTER);
private static final String EXPECTED_TYPES_PATH_CAPTION = String.format(HEADER + KEY_TYPES_PATH + GRAPH + DATA_PATH_CAPTION + FOOTER);
private static final String EXPECTED_TYPES_PATH_WRONG_CAPTION = String.format(HEADER + KEY_TYPES_PATH + GRAPH + DATA_PATH_CAPTION_DEFAULT + FOOTER);
private static final String EXPECTED_TYPES = String.format(HEADER + KEY_TYPES + GRAPH + DATA + FOOTER);
private static final String EXPECTED_TYPES_WITHOUT_CHAR_DATA_KEYS = String.format(HEADER + KEY_TYPES + GRAPH + DATA_WITHOUT_CHAR_DATA_KEYS + FOOTER);
private static final String EXPECTED_FALSE = String.format(HEADER + KEY_TYPES_FALSE + GRAPH + DATA + FOOTER);
private static final String EXPECTED_DATA = String.format(HEADER + KEY_TYPES_DATA + GRAPH + DATA_DATA + FOOTER);
private static final String EXPECTED_READ_NODE_EDGE = String.format(HEADER + GRAPH + DATA_NODE_EDGE + FOOTER);
private static final String EXPECTED_TYPES_PATH_CAMEL_CASE = String.format(HEADER + KEY_TYPES_CAMEL_CASE + GRAPH + DATA_CAMEL_CASE + FOOTER);
private static final String DATA_EMPTY = "<node id=\"n0\" labels=\":Test\"><data key=\"labels\">:Test</data><data key=\"name\"></data><data key=\"limit\">3</data></node>%n";
Expand Down Expand Up @@ -269,6 +275,26 @@ private void assertFoo(Node node){
assertEquals(Util.map("name", "foo"), node.getAllProperties());
}

@Test
public void testExportDataGraphML() throws Exception {
db.executeTransactionally("MATCH (n) DETACH DELETE n");
db.executeTransactionally("CREATE (p:Person {name: 'Foo'})");
db.executeTransactionally("CREATE (p:Person {name: 'Bar'})");
db.executeTransactionally("CREATE (p:Person {name: 'Baz'})");
db.executeTransactionally("CREATE (p:Person {name: 'Foo0'})");

File output = new File(directory, "data.graphml");
TestUtil.testCall(db, "MATCH (person:Person) \n" +
"WHERE person.name STARTS WITH \"F\"\n" +
"WITH collect(person) as people\n" +
"CALL apoc.export.graphml.data(people, [], $file, {})\n" +
"YIELD file, source, format, nodes, relationships, properties, time, rows, batchSize, batches, done, data\n" +
"RETURN *",
map("file", output.getAbsolutePath()),
(r) -> assertEquals(2L, r.get("nodes")));
assertXMLEquals(output, EXPECTED_DATA);
}

@Test
public void testExportAllGraphML() throws Exception {
File output = new File(directory, "all.graphml");
Expand Down

0 comments on commit 13f6798

Please sign in to comment.