Github user spmallette commented on a diff in the pull request: https://github.com/apache/incubator-tinkerpop/pull/175#discussion_r47421541 --- Diff: gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoTest.java --- @@ -249,6 +250,63 @@ public void shouldProperlyEncodeWithGraphML() throws Exception { // need to manually close the "g2" instance graphProvider.clear(g2, configuration); } + + @Test + @FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES) + @FeatureRequirement(featureClass = EdgePropertyFeatures.class, feature = FEATURE_STRING_VALUES) + @FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES) + public void shouldReadWriteSelfLoopingEdges() throws Exception { + final Configuration sourceConf = graphProvider.newGraphConfiguration("source", this.getClass(), name.getMethodName(), null); + final Graph source = GraphFactory.open(sourceConf); + final Vertex v1 = source.addVertex(); + final Vertex v2 = source.addVertex(); + v1.addEdge("CONTROL", v2); + v1.addEdge("SELF-LOOP", v1); + + final Configuration targetConf = graphProvider.newGraphConfiguration("target", this.getClass(), name.getMethodName(), null); + final Graph target = GraphFactory.open(targetConf); + try (ByteArrayOutputStream os = new ByteArrayOutputStream()) { + source.io(IoCore.graphml()).writer().create().writeGraph(os, source); + try (ByteArrayInputStream is = new ByteArrayInputStream(os.toByteArray())) { + target.io(IoCore.graphml()).reader().create().readGraph(is, target); + } + } catch (IOException ioe) { + throw new RuntimeException(ioe); + } + + assertEquals(IteratorUtils.count(source.vertices()), IteratorUtils.count(target.vertices())); + assertEquals(IteratorUtils.count(source.edges()), IteratorUtils.count(target.vertices())); --- End diff -- i bet this is why your test passes................. you are counting "source" edges against "target" vertices. those counts happen to match. the assert is bad. and yeah, now i see where the self-relation is only written on "inE" which is why it won't get read on "outE". Given that we know your asserts are off, please double check gryo/graphml now and be sure those are passing too. as for why, it doesn't write the edge for both "outE" and "inE" - it just seems to be the way the `StarGraph` is implemented. I sense that we call `addEdge()` on `StarGraph` which in turn chooses to call `addOutEdge` so it only gets added as an "out" edge. Not sure what the implications of that are. @okram not sure if we need to do anything with that in `StarGraph` but something to be aware of with self-relations.
--- If your project is set up for it, you can reply to this email and have your reply appear on GitHub as well. If your project does not have this feature enabled and wishes so, or if the feature is enabled but not working, please contact infrastructure at infrastruct...@apache.org or file a JIRA ticket with INFRA. ---