cancel
Showing results for 
Search instead for 
Did you mean: 

Join the community at Nodes 2022, our free virtual event on November 16 - 17.

How can I determine if two queries return the same results?

and_manousakis
Node Clone

Hi to everyone!

I ran two queries which - I believe, however I might as well be completely wrong - return the same results:

<>MATCH (src:Address)-[:REDEEMED]->(ip:IncomingPayment)-[:INCOMING_PAYMENT]->(tx:Transaction)-[:SENT_COINS]->(op:OutgoingPayment)-[:WAS_SENT_TO]->(dst:Address {AddressID: 'xxxxxxxxxxxxxxxxx'})
RETURN distinct(src.AddressID) as first_order_txs
LIMIT 5;</>

<>MATCH (src:Address)-[:REDEEMED]->(ip:IncomingPayment)-[:INCOMING_PAYMENT]->(tx:Transaction)-[:SENT_COINS]->(op:OutgoingPayment)-[:WAS_SENT_TO]->(dst:Address) WHERE dst.AddressID IN
['xxxxxxxxxxxxxxxxx']
RETURN distinct(src.AddressID) as first_order_txs
LIMIT 5;</>

The result in both cases is a table with 5 entries; the entries are not the same. My expectation was that they would be the same.

  • What am I missing? Are the two queries equivalent?
  • In the general case, how can I compare if two queries return the same result?

  • neo4j desktop 3.5.16
  • Linux 19.10

Thanks!
Andreas

1 ACCEPTED SOLUTION

Cobra
Ninja
Ninja

Hello @and.manousakis,

First of all, in case you have only one AddressID, use your first request:

MATCH (src:Address)-[:REDEEMED]->(ip:IncomingPayment)-[:INCOMING_PAYMENT]->(tx:Transaction)-[:SENT_COINS]->(op:OutgoingPayment)-[:WAS_SENT_TO]->(dst:Address {AddressID: 'xxxxxxxxxxxxxxxxx'})
RETURN distinct(src.AddressID) AS first_order_txs
LIMIT 5

But if you have multiple AddressID, use your second request:

MATCH (src:Address)-[:REDEEMED]->(ip:IncomingPayment)-[:INCOMING_PAYMENT]->(tx:Transaction)-[:SENT_COINS]->(op:OutgoingPayment)-[:WAS_SENT_TO]->(dst:Address)
WHERE dst.AddressID IN ['xxxxxxxxxxxxxxxxx']
RETURN distinct(src.AddressID) AS first_order_txs
LIMIT 5

Now if you want to get the same results, you should try to add an ORDER BY clause before the LIMIT, for example:

MATCH (src:Address)-[:REDEEMED]->(ip:IncomingPayment)-[:INCOMING_PAYMENT]->(tx:Transaction)-[:SENT_COINS]->(op:OutgoingPayment)-[:WAS_SENT_TO]->(dst:Address {AddressID: 'xxxxxxxxxxxxxxxxx'})
RETURN distinct(src.AddressID) AS first_order_txs
ORDER BY first_order_txs
LIMIT 5

Regards,
Cobra

View solution in original post

3 REPLIES 3

Cobra
Ninja
Ninja

Hello @and.manousakis,

First of all, in case you have only one AddressID, use your first request:

MATCH (src:Address)-[:REDEEMED]->(ip:IncomingPayment)-[:INCOMING_PAYMENT]->(tx:Transaction)-[:SENT_COINS]->(op:OutgoingPayment)-[:WAS_SENT_TO]->(dst:Address {AddressID: 'xxxxxxxxxxxxxxxxx'})
RETURN distinct(src.AddressID) AS first_order_txs
LIMIT 5

But if you have multiple AddressID, use your second request:

MATCH (src:Address)-[:REDEEMED]->(ip:IncomingPayment)-[:INCOMING_PAYMENT]->(tx:Transaction)-[:SENT_COINS]->(op:OutgoingPayment)-[:WAS_SENT_TO]->(dst:Address)
WHERE dst.AddressID IN ['xxxxxxxxxxxxxxxxx']
RETURN distinct(src.AddressID) AS first_order_txs
LIMIT 5

Now if you want to get the same results, you should try to add an ORDER BY clause before the LIMIT, for example:

MATCH (src:Address)-[:REDEEMED]->(ip:IncomingPayment)-[:INCOMING_PAYMENT]->(tx:Transaction)-[:SENT_COINS]->(op:OutgoingPayment)-[:WAS_SENT_TO]->(dst:Address {AddressID: 'xxxxxxxxxxxxxxxxx'})
RETURN distinct(src.AddressID) AS first_order_txs
ORDER BY first_order_txs
LIMIT 5

Regards,
Cobra

Hi @Cobra @cristiscu, thank you for the replies! I used ORDER BY src.AddressID DESC LIMIT 5; and the results were indeed the same.

Best
Andreas

cristiscu
Node Clone

Interesting finding, Andreas. I also expected the Neo4j internal parser to translate exact matches into similar queries and return the same result.

If, as Cobra said, only their result order is different, then it behaves just like in SQL: the results are indeed guaranteed to be the same, but not necessarily in the same order. Unless you use ORDER BY.

Cheers,
-C