There is actually a GitHub issue that addresses this topic. Here is the link. When you query like MATCH (v1)-[e:edge_label]-(v2) RETURN startNode(e), e, endNode(e)
it takes longer than MATCH (v1)-[e:edge_label]->(v2) RETURN startNode(e), e, endNode(e)
or if you define a label for the edge.
This is because with a direction set, you are not calculating the direction of the edge multiple times, not making a bi-direction scan. Now, defining the labels will help also because you'll query only for the labels you want and not other unnecessary ones.
You could also type something like this in your query: MATCH (V)-[R:similar*1..1]-(V2)
to make it faster with a VLE (Variable Length Edge). The regular match uses nested joins to find the results whereas the VLE MATCH uses a graph pathing function. It is a different engine that is finding the matches in each case. The VLE producing candidates that need to be filtered out.
The problem with the regular MATCH is that these JOINS can nest way to deep, depending on the graph. This is compounded by the labels being in separate tables.