0
votes

I am trying to apply filter on my Neo4j Graph DB which has 733922 nodes and 303378 relationships, the DB size is 913.56 MiB. I want to fetch all nodes which has related labels from a specific set, it works if I give upto three related nodes but takes indefinite time to process queries beyond that. If I remove order by then it works for upto five related labels. Is this the most optimised query or am I doing something wrong here? I have attached the PROFILE output for one related label.

Query Plan

MATCH p=(node1:label1{value:'a2cb2c487d9da6941f0f9c1692ed1a5a', source: 'a0b116e2-d9f5-40d4-97ff-6ca6f2ec6c9b'})-[r]-> (:a),(:b),(:c),(:d),(:e),(:f),(:g),(:h),(:i),(:j) 
RETURN node1,r 
ORDER BY node1.created DESC 
LIMIT 25
1

1 Answers

1
votes

The following

(:b),(:c),(:d),(:e),(:f),(:g),(:h),(:i),(:j)

creates a Cartesian product between all nodes with labels b,c,d etc. which will quickly grow.

If you want any of the labels a..b use following:

MATCH p=(node1:label1{value:'a2cb2c487d9da6941f0f9c1692ed1a5a', source: 'a0b116e2-d9f5-40d4-97ff-6ca6f2ec6c9b'})-[r]-> (related)
WHERE related:a OR related:b OR ....

If you want to pass labels as parameter labels you could use following in the WHERE clause

WHERE any(x in labels(n) WHERE x in $labels)