You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tinkerpop.apache.org by "Felix Chapman (JIRA)" <ji...@apache.org> on 2016/10/18 16:25:58 UTC
[jira] [Created] (TINKERPOP-1519) TinkerGraphComputer doesn't
handle multiple MessageScopes in single iteration
Felix Chapman created TINKERPOP-1519:
----------------------------------------
Summary: TinkerGraphComputer doesn't handle multiple MessageScopes in single iteration
Key: TINKERPOP-1519
URL: https://issues.apache.org/jira/browse/TINKERPOP-1519
Project: TinkerPop
Issue Type: Bug
Components: tinkergraph
Affects Versions: 3.1.1-incubating
Environment: Mac OSX
Reporter: Felix Chapman
Priority: Minor
When executing a VertexProgram that sends messages on multiple MessageScopes in a single iteration, then the messages behave as if they were sent on all scopes within that iteration.
The problem can be resolved by using only a single MessageScope per iteration, but this involves increasing the number of iterations.
An example of this behaviour is below:
{{
public class TinkerTest {
public static void main(String[] args) throws ExecutionException, InterruptedException {
TinkerGraph graph = TinkerGraph.open();
Vertex a = graph.addVertex("a");
Vertex b = graph.addVertex("b");
Vertex c = graph.addVertex("c");
a.addEdge("edge", b);
b.addEdge("edge", c);
// Simple graph:
// a -> b -> c
// Execute a traversal program that sends an incoming message of "2" and an outgoing message of "1" from "b"
// then each vertex sums any received messages
ComputerResult result = graph.compute().program(new MyVertexProgram()).submit().get();
// We expect the results to be {a=2, b=0, c=1}. Instead it is {a=3, b=0, c=3}
System.out.println(result.graph().traversal().V().group().by(Element::label).by("count").next());
}
}
class MyVertexProgram implements VertexProgram<Long> {
private final MessageScope.Local<Long> countMessageScopeIn = MessageScope.Local.of(__::inE);
private final MessageScope.Local<Long> countMessageScopeOut = MessageScope.Local.of(__::outE);
private static final String MEMORY_KEY = "count";
private static final Set<String> COMPUTE_KEYS = Collections.singleton(MEMORY_KEY);
@Override
public void setup(final Memory memory) {}
@Override
public GraphComputer.Persist getPreferredPersist() {
return GraphComputer.Persist.VERTEX_PROPERTIES;
}
@Override
public Set<String> getElementComputeKeys() {
return COMPUTE_KEYS;
}
@Override
public Set<MessageScope> getMessageScopes(final Memory memory) {
return Sets.newHashSet(countMessageScopeIn, countMessageScopeOut);
}
@Override
public void execute(Vertex vertex, Messenger<Long> messenger, Memory memory) {
switch (memory.getIteration()) {
case 0:
if (vertex.label().equals("b")) {
messenger.sendMessage(this.countMessageScopeIn, 2L);
messenger.sendMessage(this.countMessageScopeOut, 1L);
}
break;
case 1:
long edgeCount = IteratorUtils.reduce(messenger.receiveMessages(), 0L, (a, b) -> a + b);
vertex.property(MEMORY_KEY, edgeCount);
break;
}
}
@Override
public boolean terminate(final Memory memory) {
return memory.getIteration() == 1;
}
@Override
public GraphComputer.ResultGraph getPreferredResultGraph() {
return GraphComputer.ResultGraph.NEW;
}
@Override
public MyVertexProgram clone() {
try {
return (MyVertexProgram) super.clone();
} catch (final CloneNotSupportedException e) {
throw new RuntimeException(e);
}
}
}
}}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)