in gremlin-core/src/main/java/org/apache/tinkerpop/gremlin/structure/io/graphml/GraphMLReader.java [75:215]
public void readGraph(final InputStream graphInputStream, final Graph graphToWriteTo) throws IOException {
final Map<Object, Vertex> cache = new HashMap<>();
final AtomicLong counter = new AtomicLong(0);
final boolean supportsTx = graphToWriteTo.features().graph().supportsTransactions();
final Graph.Features.EdgeFeatures edgeFeatures = graphToWriteTo.features().edge();
final Graph.Features.VertexFeatures vertexFeatures = graphToWriteTo.features().vertex();
try {
final XMLStreamReader reader = inputFactory.createXMLStreamReader(graphInputStream);
final Map<String, String> keyIdMap = new HashMap<>();
final Map<String, String> keyTypesMaps = new HashMap<>();
// Buffered Vertex Data
String vertexId = null;
String vertexLabel = null;
Map<String, Object> vertexProps = null;
boolean isInVertex = false;
// Buffered Edge Data
String edgeId = null;
String edgeLabel = null;
Vertex edgeInVertex = null;
Vertex edgeOutVertex = null;
Map<String, Object> edgeProps = null;
boolean isInEdge = false;
while (reader.hasNext()) {
final Integer eventType = reader.next();
if (eventType.equals(XMLEvent.START_ELEMENT)) {
final String elementName = reader.getName().getLocalPart();
switch (elementName) {
case GraphMLTokens.KEY:
final String id = reader.getAttributeValue(null, GraphMLTokens.ID);
final String attributeName = reader.getAttributeValue(null, GraphMLTokens.ATTR_NAME);
final String attributeType = reader.getAttributeValue(null, GraphMLTokens.ATTR_TYPE);
keyIdMap.put(id, attributeName);
keyTypesMaps.put(id, attributeType);
break;
case GraphMLTokens.NODE:
vertexId = reader.getAttributeValue(null, GraphMLTokens.ID);
isInVertex = true;
vertexProps = new HashMap<>();
break;
case GraphMLTokens.EDGE:
edgeId = reader.getAttributeValue(null, GraphMLTokens.ID);
final String vertexIdOut = reader.getAttributeValue(null, GraphMLTokens.SOURCE);
final String vertexIdIn = reader.getAttributeValue(null, GraphMLTokens.TARGET);
// graphml allows edges and vertices to be mixed in terms of how they are positioned
// in the xml therefore it is possible that an edge is created prior to its definition
// as a vertex.
edgeOutVertex = findOrCreate(vertexIdOut, graphToWriteTo, vertexFeatures, cache, false);
edgeInVertex = findOrCreate(vertexIdIn, graphToWriteTo, vertexFeatures, cache, false);
if (supportsTx && counter.incrementAndGet() % batchSize == 0)
graphToWriteTo.tx().commit();
isInEdge = true;
edgeProps = new HashMap<>();
break;
case GraphMLTokens.DATA:
final String key = reader.getAttributeValue(null, GraphMLTokens.KEY);
final String dataAttributeName = keyIdMap.get(key);
if (dataAttributeName != null) {
final String value = reader.getElementText();
if (isInVertex) {
if (key.equals(vertexLabelKey))
vertexLabel = value;
else {
try {
vertexProps.put(dataAttributeName, typeCastValue(key, value, keyTypesMaps));
} catch (NumberFormatException nfe) {
if (strict) throw nfe;
}
}
} else if (isInEdge) {
if (key.equals(edgeLabelKey))
edgeLabel = value;
else {
try {
edgeProps.put(dataAttributeName, typeCastValue(key, value, keyTypesMaps));
} catch (NumberFormatException nfe) {
if (strict) throw nfe;
}
}
}
}
break;
}
} else if (eventType.equals(XMLEvent.END_ELEMENT)) {
final String elementName = reader.getName().getLocalPart();
if (elementName.equals(GraphMLTokens.NODE)) {
final String currentVertexId = vertexId;
final String currentVertexLabel = Optional.ofNullable(vertexLabel).orElse(Vertex.DEFAULT_LABEL);
final Object[] propsAsArray = vertexProps.entrySet().stream().flatMap(e -> Stream.of(e.getKey(), e.getValue())).toArray();
findOrCreate(currentVertexId, graphToWriteTo, vertexFeatures, cache,
true, ElementHelper.upsert(propsAsArray, T.label, currentVertexLabel));
if (supportsTx && counter.incrementAndGet() % batchSize == 0)
graphToWriteTo.tx().commit();
vertexId = null;
vertexLabel = null;
vertexProps = null;
isInVertex = false;
} else if (elementName.equals(GraphMLTokens.EDGE)) {
final Object[] propsAsArray = edgeProps.entrySet().stream().flatMap(e -> Stream.of(e.getKey(), e.getValue())).toArray();
final Object[] propsReady = null != edgeId && edgeFeatures.willAllowId(edgeId) ? ElementHelper.upsert(propsAsArray, T.id, edgeId) : propsAsArray;
edgeOutVertex.addEdge(null == edgeLabel ? Edge.DEFAULT_LABEL : edgeLabel, edgeInVertex, propsReady);
if (supportsTx && counter.incrementAndGet() % batchSize == 0)
graphToWriteTo.tx().commit();
edgeId = null;
edgeLabel = null;
edgeOutVertex = null;
edgeInVertex = null;
edgeProps = null;
isInEdge = false;
}
}
}
if (supportsTx) graphToWriteTo.tx().commit();
} catch (XMLStreamException xse) {
// rollback whatever portion failed
if (supportsTx && counter.incrementAndGet() % batchSize == 0)
graphToWriteTo.tx().rollback();
throw new IOException(xse);
}
}