Also for a faster procedure, pass in the label + property-key + value to
the procedure and do the lookup within the procedure.
db.findNodes(Label.label(labelName), property, value).stream()....
then you can use the fast-path of doing
CALL connectedComponent("Post",id,"3235");
Michael
On Mon, Jan 23, 2017 at 10:57 AM, Felix Dietze <[email protected]>
wrote:
> Thank you for the suggestions!
>
> I have an unique constraint on Post(id):
>
> CREATE CONSTRAINT ON (p:Post) ASSERT p.id IS UNIQUE;
>
>
> NODE_GLOBAL and breadthFirst() didn't make it any faster.
> The properties on post are id and title (empty string).
>
> Returning count(node) made it much faster and is in the range of 50-100ms.
>
> What I noticed is that even simple queries take around 10ms. That also
> seems very long:
>
> (This is running on Neo4j 3.1.1 with 2G Heap)
>
> neo4j-sh (?)$ return 5;
> +---+
> | 5 |
> +---+
> | 5 |
> +---+
> 1 row
> 9 ms
> neo4j-sh (?)$ match (n:Post {id:"3235"}) return n;
> +-----------------------+
> | n |
> +-----------------------+
> | Node[3234]{id:"3235"} |
> +-----------------------+
> 1 row
> 8 ms
> neo4j-sh (?)$ match (n:Post {id: "3235"}) CALL connectedComponent(n) yield
> node return count(node);
> +-------------+
> | count(node) |
> +-------------+
> | 15762 |
> +-------------+
> 1 row
> 77 ms
> neo4j-sh (?)$
>
> The current traversal implementation:
> return graphDatabaseService.traversalDescription()
> .breadthFirst()
> .relationships( RelTypes.CONNECTS, Direction.OUTGOING )
> .uniqueness( Uniqueness.NODE_GLOBAL )
> .traverse( start )
> .nodes().stream().map(Visited::new);
>
>
>
> Mattias, which kind of profiling do you mean? JVM?
>
>
> Am Montag, 23. Januar 2017 08:53:49 UTC+1 schrieb Mattias Persson:
>>
>> Max, `.nodes()` does this, gets the `endNode()` of all paths.
>>
>> Felix, that sounds awfully long, have you run some profiling on this?
>>
>> On Friday, January 20, 2017 at 7:28:35 PM UTC+1, Felix Dietze wrote:
>>>
>>> Hi,
>>>
>>> I'd like to know if its possible to do a faster traversal than in this
>>> stored procedure.
>>>
>>> I want to return all reachable (directed) nodes from a startnode:
>>>
>>> public class ConnectedComponent {
>>> @Context
>>> public GraphDatabaseService graphDatabaseService;
>>>
>>>
>>> private static enum RelTypes implements RelationshipType {
>>> CONNECTS
>>> }
>>>
>>>
>>> @Procedure(value = "connectedComponent")
>>> public Stream<Visited> connectedComponent(@Name("start") Node start)
>>> {
>>> return graphDatabaseService.traversalDescription()
>>> .depthFirst()
>>> .relationships( RelTypes.CONNECTS, Direction.OUTGOING )
>>> .uniqueness( Uniqueness.RELATIONSHIP_GLOBAL )
>>> .traverse( start )
>>> .nodes().stream().map(Visited::new);
>>> }
>>>
>>>
>>> public static class Visited {
>>> public final Node node;
>>> public Visited(Node node) {
>>> this.node = node;
>>> }
>>> }
>>> }
>>>
>>>
>>> I call the procedure like this:
>>> match (n:Post {id: "3235"}) CALL connectedComponent(n) yield node return
>>> node;
>>>
>>>
>>> This takes around 3 seconds for 15k visited nodes. That's about 10x slower
>>> compared to a stored procedure in postgres on the same data. Any ideas?
>>>
>>>
>>>
>>> Thank you!
>>>
>>> --
> You received this message because you are subscribed to the Google Groups
> "Neo4j" group.
> To unsubscribe from this group and stop receiving emails from it, send an
> email to [email protected].
> For more options, visit https://groups.google.com/d/optout.
>
--
You received this message because you are subscribed to the Google Groups
"Neo4j" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.