Hello,
Thanks for all your fine work on vendor agnostic graph programming.
I'm seeing the "id already exists" while using GraphMLReader on graphml written using GraphMLWriter.
I'm building up a Tinkergraph that's sufficiently large that I'm building it up in phases with persistence after each step, a read/add/write pattern. I didn't find any test cases of this pattern, here's a start on one below. My project code uses TinkerGraph.open(), here I start with classic for convenience. I'm using the sample graphml read & write code from the website doc.
I can see two edges with the same id in the graphml written by GraphMLReader.
Any insights or suggestions would be appreciated.
Thanks again,
Hugh
environment:
gremlin-core and tinkergraph-gremlin 3.0.0.M3
Java 1.8.0u25
test:
/**
*
*/
package com.hughjdevlin;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import org.junit.Before;
import org.junit.Test;
import com.tinkerpop.gremlin.structure.Graph;
import com.tinkerpop.gremlin.structure.Vertex;
import com.tinkerpop.gremlin.structure.io.GraphReader;
import com.tinkerpop.gremlin.structure.io.graphml.GraphMLReader;
import com.tinkerpop.gremlin.structure.io.graphml.GraphMLWriter;
import com.tinkerpop.gremlin.tinkergraph.structure.TinkerFactory;
import com.tinkerpop.gremlin.tinkergraph.structure.TinkerGraph;
/**
* @author hugh
*
*/
public class TinkergraphGraphmlTest {
Graph g;
public void read(String file) throws FileNotFoundException, IOException {
final GraphReader reader = GraphMLReader.build().create();
try (final InputStream is = new FileInputStream(file)) {
reader.readGraph(is, g);
}
}
public void write(String file) throws FileNotFoundException, IOException {
try (final OutputStream os = new FileOutputStream(file)) {
GraphMLWriter.build().create().writeGraph(os, g);
}
}
/**
* @throws java.lang.Exception
*/
@Before
public void setUp() throws Exception {
g = TinkerFactory.createClassic();
// Add some edges
Integer[] ids = g.V().id().toSet().toArray(new Integer[0]);
Vertex v0 = g.v(ids[0]);
for(int i = 1; i < ids.length; i++) {
v0.addEdge("newEdge", g.v(ids[i]));
}
write("db/TinkergraphGraphmlTest.graphml");
g.close();
g = TinkerGraph.open();
}
@Test
public void testReadGraphml() throws FileNotFoundException, IOException {
read("db/TinkergraphGraphmlTest.graphml");
}
}
stack trace:
java.lang.IllegalArgumentException: Edge with id already exists: 12
at com.tinkerpop.gremlin.structure.Graph$Exceptions.edgeWithIdAlreadyExists(Graph.java:803)
at com.tinkerpop.gremlin.tinkergraph.structure.TinkerHelper.addEdge(TinkerHelper.java:42)
at com.tinkerpop.gremlin.tinkergraph.structure.TinkerVertex.addEdge(TinkerVertex.java:76)
at com.tinkerpop.gremlin.structure.util.batch.BatchGraph$BatchVertex.addEdge(BatchGraph.java:358)
at com.tinkerpop.gremlin.structure.io.graphml.GraphMLReader.readGraph(GraphMLReader.java:189)
at com.hughjdevlin.TinkergraphGraphmlTest.read(TinkergraphGraphmlTest.java:33)
at com.hughjdevlin.TinkergraphGraphmlTest.testReadGraphml(TinkergraphGraphmlTest.java:62)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70)
at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229)
at org.junit.runners.ParentRunner.run(ParentRunner.java:309)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
graphml:
<key id="labelV" for="node" attr.name="labelV" attr.type="string"/> <key id="name" for="node" attr.name="name" attr.type="string"/> <key id="lang" for="node" attr.name="lang" attr.type="string"/> <key id="age" for="node" attr.name="age" attr.type="int"/> <key id="labelE" for="edge" attr.name="labelE" attr.type="string"/> <key id="weight" for="edge" attr.name="weight" attr.type="float"/> <graph id="G" edgedefault="directed">
<node id="1">
<data key="labelV">vertex</data>
<data key="name">marko</data>
<data key="age">29</data>
</node>
<node id="2">
<data key="labelV">vertex</data>
<data key="name">vadas</data>
<data key="age">27</data>
</node>
<node id="3">
<data key="labelV">vertex</data>
<data key="name">lop</data>
<data key="lang">java</data>
</node>
<node id="4">
<data key="labelV">vertex</data>
<data key="name">josh</data>
<data key="age">32</data>
</node>
<node id="5">
<data key="labelV">vertex</data>
<data key="name">ripple</data>
<data key="lang">java</data>
</node>
<node id="6">
<data key="labelV">vertex</data>
<data key="name">peter</data>
<data key="age">35</data>
</node>
<edge id="16" source="1" target="6">
<data key="labelE">newEdge</data>
</edge>
<edge id="7" source="1" target="2">
<data key="labelE">knows</data>
<data key="weight">0.5</data>
</edge>
<edge id="8" source="1" target="4">
<data key="labelE">knows</data>
<data key="weight">1.0</data>
</edge>
<edge id="9" source="1" target="3">
<data key="labelE">created</data>
<data key="weight">0.4</data>
</edge>
<edge id="10" source="4" target="5">
<data key="labelE">created</data>
<data key="weight">1.0</data>
</edge>
<edge id="11" source="4" target="3">
<data key="labelE">created</data>
<data key="weight">0.4</data>
</edge>
<edge id="12" source="6" target="3">
<data key="labelE">created</data>
<data key="weight">0.2</data>
</edge>
<edge id="12" source="1" target="2">
<data key="labelE">newEdge</data>
</edge>
<edge id="13" source="1" target="3">
<data key="labelE">newEdge</data>
</edge>
<edge id="14" source="1" target="4">
<data key="labelE">newEdge</data>
</edge>
<edge id="15" source="1" target="5">
<data key="labelE">newEdge</data>
</edge>
</graph>
</graphml>