[ https://issues.apache.org/jira/browse/TINKERPOP-1519?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16064923#comment-16064923 ]
ASF GitHub Bot commented on TINKERPOP-1519: ------------------------------------------- Github user asfgit closed the pull request at: https://github.com/apache/tinkerpop/pull/632 > 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. > e.g. if you send message {{A}} on {{out}} edges, and message {{B}} on {{in}} > edges, then {{A}} and {{B}} will instead be sent over both {{in}} and {{out}} > edges. > 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: > {code:java} > 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); > } > } > } > {code} -- This message was sent by Atlassian JIRA (v6.4.14#64029)