[ 
https://issues.apache.org/jira/browse/TINKERPOP-1099?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

stephen mallette closed TINKERPOP-1099.
---------------------------------------
    Resolution: Won't Fix

Given that we've deprecated BLVP in 3.2.10 and have a different path for bulk 
loading I think that we will simply close this one at this point.

> IncrementalBulkLoader's getOrCreateEdge overwrites previously added self-loops
> ------------------------------------------------------------------------------
>
>                 Key: TINKERPOP-1099
>                 URL: https://issues.apache.org/jira/browse/TINKERPOP-1099
>             Project: TinkerPop
>          Issue Type: Bug
>          Components: hadoop, io
>    Affects Versions: 3.1.1-incubating
>         Environment: Linux, CentOS 6.4
>            Reporter: Dylan Bethune-Waddell
>            Priority: Major
>   Original Estimate: 24h
>  Remaining Estimate: 24h
>
> The traversal in this function assumes that only one edge will be returned 
> and if it is returned then we should "get" and not "create" that edge, but 
> any number of self-edges on a vertex will be picked up by this traversal. 
> Further, they are allowed to have different properties than the edge we are 
> about to load, causing the first self-edge returned to be repeatedly 
> overwritten or have properties appended to it. On a fresh bulk load, only the 
> very last self-edge of a given label out of all self-edges of that label that 
> were going to be added appears in the graph.
> {code:title=IncrementalBulkLoader.java (lines 51-77)}
> @Override
>     public Edge getOrCreateEdge(final Edge edge, final Vertex outVertex, 
> final Vertex inVertex, final Graph graph, final GraphTraversalSource g) {
>         final Edge e;
>         final Traversal<Vertex, Edge> t = 
> g.V(outVertex).outE(edge.label()).filter(__.inV().is(inVertex));
>         if (t.hasNext()) {
>             e = t.next();
>             edge.properties().forEachRemaining(property -> {
>                 final Property<?> existing = e.property(property.key());
>                 if (!existing.isPresent() || 
> !existing.value().equals(property.value())) {
>                     e.property(property.key(), property.value());
>                 }
>             });
>         } else {
>             e = createEdge(edge, outVertex, inVertex, graph, g);
>         }
>         return e;
>     }
> {code}
> It would seem that the values of any properties on the edge must be compared 
> to try a "get" instead of just creating the edge, but if there are no 
> properties on the (weird) self-edge, I have no idea what reasonable behaviour 
> would be.
> I may be able to submit a PR for this later today so I'll assign myself for 
> now but feel free to put it in better hands - this seems like something 
> relatively minor to provide a decent interim fix for, and it does overwrite 
> user data in the graph so I vote that a fix gets pushed into 3.1.1 and I have 
> flagged it as "important".
> *Tested on*: 
> - Linux/CentOS 6.4
> - Titan 1.1 (6 nodes) and TinkerGraph 
> - TinkerPop-3.1.1-SNAPSHOT
> - Spark 1.5.2
> - Hadoop 2.7.1 



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to