You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tinkerpop.apache.org by sp...@apache.org on 2019/06/25 19:29:51 UTC
[tinkerpop] branch master updated (75b2ab2 -> 6f74db7)
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a change to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git.
from 75b2ab2 Merge pull request #1145 from BrynCooke/TINKERPOP-2243
add c13e8fd TINKERPOP-2238 Fixed iterator leaks for GraphMLWriter
add 05143f4 TINKERPOP-2238 Fixed iterator leak in subgraph() step
add 32ee56f TINKERPOP-2238 Fixed iterator leak in SubgraphStrategy test
add 8eb734d TINKERPOP-2238 Fixed iterator leaks in BLVP test
add d89bb78 TINKERPOP-2238 Fixed GraphComputerTest iterator leak
add 5935b8f TINKERPOP-2238 Fixed iterator leaks in generator tests
add ac22cf9 TINKERPOP-2238 Removed the temporary IgnoreIteratorLeak
add cba5081 TINKERPOP-2238 Updates to dev docs around iterator leaks.
new 1f7e0e1 Merge branch 'TINKERPOP-2238' into tp33
new d0d32fa Merge branch 'tp33' into tp34
new 6f74db7 Merge branch 'tp34'
The 3 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails. The revisions
listed as "add" were already present in the repository and have only
been added to this reference.
Summary of changes:
.../dev/developer/development-environment.asciidoc | 1 +
docs/src/dev/provider/index.asciidoc | 8 +-
.../traversal/step/sideEffect/SubgraphStep.java | 17 +-
.../structure/io/graphml/GraphMLWriter.java | 179 +++++++++++----------
.../tinkerpop/gremlin/AbstractGremlinTest.java | 8 +-
.../tinkerpop/gremlin/IgnoreIteratorLeak.java | 41 -----
.../algorithm/generator/AbstractGeneratorTest.java | 21 ++-
.../generator/CommunityGeneratorTest.java | 3 -
.../generator/DistributionGeneratorTest.java | 5 +-
.../process/computer/GraphComputerTest.java | 9 +-
.../traversal/TraversalInterruptionTest.java | 2 -
.../traversal/step/sideEffect/SubgraphTest.java | 2 -
.../decoration/SubgraphStrategyProcessTest.java | 4 +-
.../tinkerpop/gremlin/structure/io/IoTest.java | 3 -
.../tinkergraph/structure/TinkerGraphIterator.java | 12 +-
15 files changed, 147 insertions(+), 168 deletions(-)
delete mode 100644 gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/IgnoreIteratorLeak.java
[tinkerpop] 01/03: Merge branch 'TINKERPOP-2238' into tp33
Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 1f7e0e143b8581c91d3be43ba0a777478deec040
Merge: dcf9e07 cba5081
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Tue Jun 25 14:51:17 2019 -0400
Merge branch 'TINKERPOP-2238' into tp33
.../dev/developer/development-environment.asciidoc | 1 +
docs/src/dev/provider/index.asciidoc | 8 +-
.../traversal/step/sideEffect/SubgraphStep.java | 17 ++-
.../structure/io/graphml/GraphMLWriter.java | 169 +++++++++++----------
.../tinkerpop/gremlin/AbstractGremlinTest.java | 8 +-
.../tinkerpop/gremlin/IgnoreIteratorLeak.java | 41 -----
.../algorithm/generator/AbstractGeneratorTest.java | 21 ++-
.../generator/CommunityGeneratorTest.java | 3 -
.../generator/DistributionGeneratorTest.java | 5 +-
.../process/computer/GraphComputerTest.java | 9 +-
.../bulkloading/BulkLoaderVertexProgramTest.java | 9 +-
.../traversal/TraversalInterruptionTest.java | 2 -
.../traversal/step/sideEffect/SubgraphTest.java | 2 -
.../decoration/SubgraphStrategyProcessTest.java | 4 +-
.../tinkerpop/gremlin/structure/io/IoTest.java | 2 -
.../tinkergraph/structure/TinkerGraphIterator.java | 12 +-
16 files changed, 148 insertions(+), 165 deletions(-)
[tinkerpop] 03/03: Merge branch 'tp34'
Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit 6f74db7551299334eb17a16cfebcc77634b53dc6
Merge: 75b2ab2 d0d32fa
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Tue Jun 25 15:29:39 2019 -0400
Merge branch 'tp34'
.../dev/developer/development-environment.asciidoc | 1 +
docs/src/dev/provider/index.asciidoc | 8 +-
.../traversal/step/sideEffect/SubgraphStep.java | 17 +-
.../structure/io/graphml/GraphMLWriter.java | 179 +++++++++++----------
.../tinkerpop/gremlin/AbstractGremlinTest.java | 8 +-
.../tinkerpop/gremlin/IgnoreIteratorLeak.java | 41 -----
.../algorithm/generator/AbstractGeneratorTest.java | 21 ++-
.../generator/CommunityGeneratorTest.java | 3 -
.../generator/DistributionGeneratorTest.java | 5 +-
.../process/computer/GraphComputerTest.java | 9 +-
.../traversal/TraversalInterruptionTest.java | 2 -
.../traversal/step/sideEffect/SubgraphTest.java | 2 -
.../decoration/SubgraphStrategyProcessTest.java | 4 +-
.../tinkerpop/gremlin/structure/io/IoTest.java | 3 -
.../tinkergraph/structure/TinkerGraphIterator.java | 12 +-
15 files changed, 147 insertions(+), 168 deletions(-)
[tinkerpop] 02/03: Merge branch 'tp33' into tp34
Posted by sp...@apache.org.
This is an automated email from the ASF dual-hosted git repository.
spmallette pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/tinkerpop.git
commit d0d32fa00dfe7430d806e313f6e00155c02de3c4
Merge: e8de6e9 1f7e0e1
Author: Stephen Mallette <sp...@genoprime.com>
AuthorDate: Tue Jun 25 15:29:13 2019 -0400
Merge branch 'tp33' into tp34
.../dev/developer/development-environment.asciidoc | 1 +
docs/src/dev/provider/index.asciidoc | 8 +-
.../traversal/step/sideEffect/SubgraphStep.java | 17 +-
.../structure/io/graphml/GraphMLWriter.java | 179 +++++++++++----------
.../tinkerpop/gremlin/AbstractGremlinTest.java | 8 +-
.../tinkerpop/gremlin/IgnoreIteratorLeak.java | 41 -----
.../algorithm/generator/AbstractGeneratorTest.java | 21 ++-
.../generator/CommunityGeneratorTest.java | 3 -
.../generator/DistributionGeneratorTest.java | 5 +-
.../process/computer/GraphComputerTest.java | 9 +-
.../bulkloading/BulkLoaderVertexProgramTest.java | 9 +-
.../traversal/TraversalInterruptionTest.java | 2 -
.../traversal/step/sideEffect/SubgraphTest.java | 2 -
.../decoration/SubgraphStrategyProcessTest.java | 4 +-
.../tinkerpop/gremlin/structure/io/IoTest.java | 3 -
.../tinkergraph/structure/TinkerGraphIterator.java | 12 +-
16 files changed, 153 insertions(+), 171 deletions(-)
diff --cc docs/src/dev/provider/index.asciidoc
index 162e907,1185d0c..54e5f98
--- a/docs/src/dev/provider/index.asciidoc
+++ b/docs/src/dev/provider/index.asciidoc
@@@ -773,12 -813,15 +774,15 @@@ the query is finished
TinkerPop provides you with the ability to test for such resource leaks by checking for leaks when you run the
Gremlin-Test suites against your implementation. To enable this leak detection, providers should increment the
- `StoreIteratorCounter` whenever a reource is opened and decrement it when it is closed. A reference implementation
+ `StoreIteratorCounter` whenever a resource is opened and decrement it when it is closed. A reference implementation
is provided with TinkerGraph as `TinkerGraphIterator.java`.
+ Assertions for leak detection are enabled by default when running the test suite. They can be temporarily disabled
+ by way of a system property - simply set `-DtestIteratorLeaks=false".
+
=== Accessibility via GremlinPlugin
-image:gremlin-plugin.png[width=100,float=left] The applications distributed with TinkerPop3 do not distribute with
+image:gremlin-plugin.png[width=100,float=left] The applications distributed with TinkerPop do not distribute with
any graph system implementations besides TinkerGraph. If your implementation is stored in a Maven repository (e.g.
Maven Central Repository), then it is best to provide a <<gremlin-plugins,`GremlinPlugin`>> implementation so the respective jars can be
downloaded according and when required by the user. Neo4j's GremlinPlugin is provided below for reference.
diff --cc gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
index 59812f0,6d31cc8..8f0d1e0
--- a/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
+++ b/gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLWriter.java
@@@ -214,24 -213,16 +215,24 @@@ public final class GraphMLWriter implem
return writer;
} else
return utf8Writer;
- }
+ }
private void writeTypes(final Map<String, String> identifiedVertexKeyTypes,
- final Map<String, String> identifiedEdgeKeyTypes,
- final XMLStreamWriter writer) throws XMLStreamException {
+ final Map<String, String> identifiedEdgeKeyTypes,
+ final XMLStreamWriter writer) throws XMLStreamException {
// <key id="weight" for="edge" attr.name="weight" attr.type="float"/>
- final Collection<String> vertexKeySet = getVertexKeysAndNormalizeIfRequired(identifiedVertexKeyTypes);
- final Collection<String> edgeKeySet = getEdgeKeysAndNormalizeIfRequired(identifiedEdgeKeyTypes);
+ final Collection<String> vertexKeySet = getKeysAndNormalizeIfRequired(identifiedVertexKeyTypes);
++ final Collection<String> edgeKeySet = getKeysAndNormalizeIfRequired(identifiedEdgeKeyTypes);
+ // in case vertex and edge may have the same attribute name, the key id in graphml have to be different
+ intersection = CollectionUtils.intersection(vertexKeySet, edgeKeySet);
+
for (String key : vertexKeySet) {
writer.writeStartElement(GraphMLTokens.KEY);
- writer.writeAttribute(GraphMLTokens.ID, key);
+ if (intersection.contains(key)) {
+ writer.writeAttribute(GraphMLTokens.ID, key.concat(GraphMLTokens.VERTEX_SUFFIX));
+ } else {
+ writer.writeAttribute(GraphMLTokens.ID, key);
+ }
writer.writeAttribute(GraphMLTokens.FOR, GraphMLTokens.NODE);
writer.writeAttribute(GraphMLTokens.ATTR_NAME, key);
writer.writeAttribute(GraphMLTokens.ATTR_TYPE, identifiedVertexKeyTypes.get(key));
@@@ -252,66 -241,62 +253,70 @@@
}
private void writeEdges(final XMLStreamWriter writer, final Graph graph) throws XMLStreamException {
- if (normalize) {
- final List<Edge> edges = IteratorUtils.list(graph.edges());
- Collections.sort(edges, Comparators.ELEMENT_COMPARATOR);
-
- for (Edge edge : edges) {
- writer.writeStartElement(GraphMLTokens.EDGE);
- writer.writeAttribute(GraphMLTokens.ID, edge.id().toString());
- writer.writeAttribute(GraphMLTokens.SOURCE, edge.outVertex().id().toString());
- writer.writeAttribute(GraphMLTokens.TARGET, edge.inVertex().id().toString());
-
- writer.writeStartElement(GraphMLTokens.DATA);
- writer.writeAttribute(GraphMLTokens.KEY, this.edgeLabelKey);
- writer.writeCharacters(edge.label());
- writer.writeEndElement();
+ final Iterator<Edge> iterator = graph.edges();
+ try {
+ if (normalize) {
+ final List<Edge> edges = IteratorUtils.list(iterator);
+ Collections.sort(edges, Comparators.ELEMENT_COMPARATOR);
- final List<String> keys = new ArrayList<>(edge.keys());
- Collections.sort(keys);
+ for (Edge edge : edges) {
+ writer.writeStartElement(GraphMLTokens.EDGE);
+ writer.writeAttribute(GraphMLTokens.ID, edge.id().toString());
+ writer.writeAttribute(GraphMLTokens.SOURCE, edge.outVertex().id().toString());
+ writer.writeAttribute(GraphMLTokens.TARGET, edge.inVertex().id().toString());
- for (String key : keys) {
writer.writeStartElement(GraphMLTokens.DATA);
- if (intersection != null && intersection.contains(key)) {
- writer.writeAttribute(GraphMLTokens.KEY, key + GraphMLTokens.EDGE_SUFFIX);
- } else {
- writer.writeAttribute(GraphMLTokens.KEY, key);
+ writer.writeAttribute(GraphMLTokens.KEY, this.edgeLabelKey);
+ writer.writeCharacters(edge.label());
+ writer.writeEndElement();
+
+ final List<String> keys = new ArrayList<>(edge.keys());
+ Collections.sort(keys);
+
+ for (String key : keys) {
+ writer.writeStartElement(GraphMLTokens.DATA);
- writer.writeAttribute(GraphMLTokens.KEY, key);
++ if (intersection != null && intersection.contains(key)) {
++ writer.writeAttribute(GraphMLTokens.KEY, key + GraphMLTokens.EDGE_SUFFIX);
++ } else {
++ writer.writeAttribute(GraphMLTokens.KEY, key);
++ }
+ // technically there can't be a null here as gremlin structure forbids that occurrence even if Graph
+ // implementations support it, but out to empty string just in case.
+ writer.writeCharacters(edge.property(key).orElse("").toString());
+ writer.writeEndElement();
}
- // technically there can't be a null here as gremlin structure forbids that occurrence even if Graph
- // implementations support it, but out to empty string just in case.
- writer.writeCharacters(edge.property(key).orElse("").toString());
writer.writeEndElement();
}
- writer.writeEndElement();
- }
- } else {
- final Iterator<Edge> iterator = graph.edges();
- while (iterator.hasNext()) {
- final Edge edge = iterator.next();
- writer.writeStartElement(GraphMLTokens.EDGE);
- writer.writeAttribute(GraphMLTokens.ID, edge.id().toString());
- writer.writeAttribute(GraphMLTokens.SOURCE, edge.outVertex().id().toString());
- writer.writeAttribute(GraphMLTokens.TARGET, edge.inVertex().id().toString());
-
- writer.writeStartElement(GraphMLTokens.DATA);
- writer.writeAttribute(GraphMLTokens.KEY, this.edgeLabelKey);
- writer.writeCharacters(edge.label());
- writer.writeEndElement();
+ } else {
+ while (iterator.hasNext()) {
+ final Edge edge = iterator.next();
+ writer.writeStartElement(GraphMLTokens.EDGE);
+ writer.writeAttribute(GraphMLTokens.ID, edge.id().toString());
+ writer.writeAttribute(GraphMLTokens.SOURCE, edge.outVertex().id().toString());
+ writer.writeAttribute(GraphMLTokens.TARGET, edge.inVertex().id().toString());
- for (String key : edge.keys()) {
writer.writeStartElement(GraphMLTokens.DATA);
- if (intersection != null && intersection.contains(key)) {
- writer.writeAttribute(GraphMLTokens.KEY, key + GraphMLTokens.EDGE_SUFFIX);
- } else {
- writer.writeAttribute(GraphMLTokens.KEY, key);
+ writer.writeAttribute(GraphMLTokens.KEY, this.edgeLabelKey);
+ writer.writeCharacters(edge.label());
+ writer.writeEndElement();
+
+ for (String key : edge.keys()) {
+ writer.writeStartElement(GraphMLTokens.DATA);
- writer.writeAttribute(GraphMLTokens.KEY, key);
++ if (intersection != null && intersection.contains(key)) {
++ writer.writeAttribute(GraphMLTokens.KEY, key + GraphMLTokens.EDGE_SUFFIX);
++ } else {
++ writer.writeAttribute(GraphMLTokens.KEY, key);
++ }
+ // technically there can't be a null here as gremlin structure forbids that occurrence even if Graph
+ // implementations support it, but out to empty string just in case.
+ writer.writeCharacters(edge.property(key).orElse("").toString());
+ writer.writeEndElement();
}
- // technically there can't be a null here as gremlin structure forbids that occurrence even if Graph
- // implementations support it, but out to empty string just in case.
- writer.writeCharacters(edge.property(key).orElse("").toString());
writer.writeEndElement();
}
- writer.writeEndElement();
}
+ } finally {
+ CloseableIterator.closeIterator(iterator);
}
}
diff --cc gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
index c2650c4,95cfbb4..933be7c
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/AbstractGremlinTest.java
@@@ -31,7 -31,7 +31,6 @@@ import org.apache.tinkerpop.gremlin.str
import org.apache.tinkerpop.gremlin.util.iterator.IteratorUtils;
import org.apache.tinkerpop.gremlin.util.iterator.StoreIteratorCounter;
import org.junit.After;
--import org.junit.Assert;
import org.junit.Before;
import org.junit.Rule;
import org.junit.rules.TestName;
@@@ -79,18 -76,8 +77,16 @@@ public abstract class AbstractGremlinTe
final LoadGraphWith[] loadGraphWiths = testMethod.getAnnotationsByType(LoadGraphWith.class);
final LoadGraphWith loadGraphWith = loadGraphWiths.length == 0 ? null : loadGraphWiths[0];
final LoadGraphWith.GraphData loadGraphWithData = null == loadGraphWith ? null : loadGraphWith.value();
+ final Set<FeatureRequirement> featureRequirementSet = getFeatureRequirementsForTest(testMethod, loadGraphWiths);
- this.shouldTestIteratorLeak = !this.getClass().isAnnotationPresent(IgnoreIteratorLeak.class);
-
graphProvider = GraphManager.getGraphProvider();
+
+ // pre-check if available from graph provider to avoid graph creation
+ final Optional<Graph.Features> staticFeatures = graphProvider.getStaticFeatures();
+ if (staticFeatures.isPresent()) {
+ assumeRequirementsAreMetForTest(featureRequirementSet, staticFeatures.get(), true);
+ }
+
graphProvider.getTestListener().ifPresent(l -> l.onTestStart(this.getClass(), name.getMethodName()));
// Reset the counter for open iterators by this test
diff --cc gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
index 89e7b4e,9152655..cf1c790
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/process/traversal/strategy/decoration/SubgraphStrategyProcessTest.java
@@@ -20,10 -20,9 +20,9 @@@ package org.apache.tinkerpop.gremlin.pr
import org.apache.commons.configuration.MapConfiguration;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
- import org.apache.tinkerpop.gremlin.IgnoreIteratorLeak;
import org.apache.tinkerpop.gremlin.process.AbstractGremlinProcessTest;
import org.apache.tinkerpop.gremlin.process.GremlinProcessRunner;
-import org.apache.tinkerpop.gremlin.process.remote.RemoteGraph;
+import org.apache.tinkerpop.gremlin.structure.RemoteGraph;
import org.apache.tinkerpop.gremlin.process.traversal.Order;
import org.apache.tinkerpop.gremlin.process.traversal.P;
import org.apache.tinkerpop.gremlin.process.traversal.Traversal;
diff --cc gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoTest.java
index 796de31,64bc361..af73ada
--- a/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoTest.java
+++ b/gremlin-test/src/main/java/org/apache/tinkerpop/gremlin/structure/io/IoTest.java
@@@ -21,7 -21,7 +21,6 @@@ package org.apache.tinkerpop.gremlin.st
import org.apache.commons.configuration.Configuration;
import org.apache.tinkerpop.gremlin.AbstractGremlinTest;
import org.apache.tinkerpop.gremlin.FeatureRequirement;
--import org.apache.tinkerpop.gremlin.IgnoreIteratorLeak;
import org.apache.tinkerpop.gremlin.LoadGraphWith;
import org.apache.tinkerpop.gremlin.TestHelper;
import org.apache.tinkerpop.gremlin.structure.Direction;
@@@ -110,90 -110,7 +109,88 @@@ import static org.junit.Assume.assumeTh
public class IoTest {
private static final Logger logger = LoggerFactory.getLogger(IoTest.class);
+ private static final String CLASSIC_GRAPH_WITH_COLOR = "<?xml version=\"1.0\" ?>\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.1/graphml.xsd\">\n" +
+ " <key id=\"age\" for=\"node\" attr.name=\"age\" attr.type=\"int\"></key>\n" +
+ " <key id=\"colorV\" for=\"node\" attr.name=\"color\" attr.type=\"string\"></key>\n" +
+ " <key id=\"labelV\" for=\"node\" attr.name=\"labelV\" attr.type=\"string\"></key>\n" +
+ " <key id=\"lang\" for=\"node\" attr.name=\"lang\" attr.type=\"string\"></key>\n" +
+ " <key id=\"name\" for=\"node\" attr.name=\"name\" attr.type=\"string\"></key>\n" +
+ " <key id=\"colorE\" for=\"edge\" attr.name=\"color\" attr.type=\"string\"></key>\n" +
+ " <key id=\"labelE\" for=\"edge\" attr.name=\"labelE\" attr.type=\"string\"></key>\n" +
+ " <key id=\"weight\" for=\"edge\" attr.name=\"weight\" attr.type=\"float\"></key>\n" +
+ " <graph id=\"G\" edgedefault=\"directed\">\n" +
+ " <node id=\"1\">\n" +
+ " <data key=\"labelV\">vertex</data>\n" +
+ " <data key=\"age\">29</data>\n" +
+ " <data key=\"colorV\">#6495ed</data>\n" +
+ " <data key=\"name\">marko</data>\n" +
+ " </node>\n" +
+ " <node id=\"2\">\n" +
+ " <data key=\"labelV\">vertex</data>\n" +
+ " <data key=\"age\">27</data>\n" +
+ " <data key=\"colorV\">#6495ed</data>\n" +
+ " <data key=\"name\">vadas</data>\n" +
+ " </node>\n" +
+ " <node id=\"3\">\n" +
+ " <data key=\"labelV\">vertex</data>\n" +
+ " <data key=\"lang\">java</data>\n" +
+ " <data key=\"colorV\">#6495ed</data>\n" +
+ " <data key=\"name\">lop</data>\n" +
+ " </node>\n" +
+ " <node id=\"4\">\n" +
+ " <data key=\"labelV\">vertex</data>\n" +
+ " <data key=\"age\">32</data>\n" +
+ " <data key=\"colorV\">#6495ed</data>\n" +
+ " <data key=\"name\">josh</data>\n" +
+ " </node>\n" +
+ " <node id=\"5\">\n" +
+ " <data key=\"labelV\">vertex</data>\n" +
+ " <data key=\"lang\">java</data>\n" +
+ " <data key=\"colorV\">#6495ed</data>\n" +
+ " <data key=\"name\">ripple</data>\n" +
+ " </node>\n" +
+ " <node id=\"6\">\n" +
+ " <data key=\"labelV\">vertex</data>\n" +
+ " <data key=\"age\">35</data>\n" +
+ " <data key=\"colorV\">#6495ed</data>\n" +
+ " <data key=\"name\">peter</data>\n" +
+ " </node>\n" +
+ " <edge id=\"10\" source=\"4\" target=\"5\">\n" +
+ " <data key=\"labelE\">created</data>\n" +
+ " <data key=\"colorE\">#ee0000</data>\n" +
+ " <data key=\"weight\">1.0</data>\n" +
+ " </edge>\n" +
+ " <edge id=\"11\" source=\"4\" target=\"3\">\n" +
+ " <data key=\"labelE\">created</data>\n" +
+ " <data key=\"colorE\">#ee0000</data>\n" +
+ " <data key=\"weight\">0.4</data>\n" +
+ " </edge>\n" +
+ " <edge id=\"12\" source=\"6\" target=\"3\">\n" +
+ " <data key=\"labelE\">created</data>\n" +
+ " <data key=\"colorE\">#ee0000</data>\n" +
+ " <data key=\"weight\">0.2</data>\n" +
+ " </edge>\n" +
+ " <edge id=\"7\" source=\"1\" target=\"2\">\n" +
+ " <data key=\"labelE\">knows</data>\n" +
+ " <data key=\"colorE\">#ee0000</data>\n" +
+ " <data key=\"weight\">0.5</data>\n" +
+ " </edge>\n" +
+ " <edge id=\"8\" source=\"1\" target=\"4\">\n" +
+ " <data key=\"labelE\">knows</data>\n" +
+ " <data key=\"colorE\">#ee0000</data>\n" +
+ " <data key=\"weight\">1.0</data>\n" +
+ " </edge>\n" +
+ " <edge id=\"9\" source=\"1\" target=\"3\">\n" +
+ " <data key=\"labelE\">created</data>\n" +
+ " <data key=\"colorE\">#ee0000</data>\n" +
+ " <data key=\"weight\">0.4</data>\n" +
+ " </edge>\n" +
+ " </graph>\n" +
+ "</graphml>";
+
- @IgnoreIteratorLeak
public static class GraphMLTest extends AbstractGremlinTest {
+
@Test
@FeatureRequirement(featureClass = Graph.Features.EdgeFeatures.class, feature = Graph.Features.EdgeFeatures.FEATURE_ADD_EDGES)
@FeatureRequirement(featureClass = Graph.Features.VertexFeatures.class, feature = Graph.Features.VertexFeatures.FEATURE_ADD_VERTICES)