bitnine-oss / agensgraph

AgensGraph, a transactional graph database based on PostgreSQL
http://www.agensgraph.org
Other
1.34k stars 148 forks source link

Inconsistent results when executing equivalent queries #617

Closed YuanchengJiang closed 1 year ago

YuanchengJiang commented 1 year ago

Version: 2.13.0

Query 1:

MATCH ()-[]->(a), (a)-[]->() RETURN count(a)
// result: 9900

Query 2:

MATCH ()-[]->(a)-[]->() RETURN count(a)
// result: 998
samoscyberallenh commented 1 year ago

This seems like a bug to me. Consider this test case:

postgres=# create graph test;
CREATE GRAPH
postgres=# set graph_path to test;
SET
postgres=# create vlabel person;
CREATE VLABEL
postgres=# create elabel knows;
CREATE ELABEL
postgres=# 
postgres=# create (fred:person {name: 'Fred'})-[:knows {name: 'Fred/Rob'}]->(rob:person {name: 'Rob'}), (rob)-[:knows {name: 'Rob/Sam'}]->(sam:person {name: 'Sam'}), (sam)-[:knows {name: 'Sam/Joe'}]->(joe:person {name: 'Joe'});
UPDATE 7
postgres=# match (a)-[e1]->(b)-[e2]->(c) return a.name as a, e1.name as e1, b.name as b, b.name as b, e2.name as e2, c.name as c;
   a    |     e1     |   b   |   b   |    e2     |   c   
--------+------------+-------+-------+-----------+-------
 "Fred" | "Fred/Rob" | "Rob" | "Rob" | "Rob/Sam" | "Sam"
 "Rob"  | "Rob/Sam"  | "Sam" | "Sam" | "Sam/Joe" | "Joe"
(2 rows)

OK, so far so good. That's equivalent to your Query 2. Those are the results I expected to see.

Now let's try to do something like your Query 1:

postgres=# match (a)-[e1]->(b), (b)-[e2]->(c) return a.name as a, e1.name as e1, b.name as b, b.name as b, e2.name as e2, c.name as c;
   a    |     e1     |   b    |   b    |     e2     |   c   
--------+------------+--------+--------+------------+-------
 "Rob"  | "Rob/Sam"  | "Fred" | "Fred" | "Fred/Rob" | "Rob"
 "Sam"  | "Sam/Joe"  | "Fred" | "Fred" | "Fred/Rob" | "Rob"
 "Fred" | "Fred/Rob" | "Rob"  | "Rob"  | "Rob/Sam"  | "Sam"
 "Sam"  | "Sam/Joe"  | "Rob"  | "Rob"  | "Rob/Sam"  | "Sam"
 "Fred" | "Fred/Rob" | "Sam"  | "Sam"  | "Sam/Joe"  | "Joe"
 "Rob"  | "Rob/Sam"  | "Sam"  | "Sam"  | "Sam/Joe"  | "Joe"
(6 rows)

Well, that's not good. Some of those edges are just not right. Specifically, these are wrong (the edges that are shown don't match the corresponding vertices):

 "Rob"  | "Rob/Sam"  | "Fred" | "Fred" | "Fred/Rob" | "Rob"
 "Sam"  | "Sam/Joe"  | "Fred" | "Fred" | "Fred/Rob" | "Rob"
 "Sam"  | "Sam/Joe"  | "Rob"  | "Rob"  | "Rob/Sam"  | "Sam"
 "Fred" | "Fred/Rob" | "Sam"  | "Sam"  | "Sam/Joe"  | "Joe"

Interestingly though, if you give "b" a label in the query it resolves the issue:

postgres=# match (a)-[e1]->(b:person), (b:person)-[e2]->(c) return a.name as a, e1.name as e1, b.name as b, b.name as b, e2.name as e2, c.name as c;
   a    |     e1     |   b   |   b   |    e2     |   c   
--------+------------+-------+-------+-----------+-------
 "Fred" | "Fred/Rob" | "Rob" | "Rob" | "Rob/Sam" | "Sam"
 "Rob"  | "Rob/Sam"  | "Sam" | "Sam" | "Sam/Joe" | "Joe"
(2 rows)

I'm using v2.13.0 here.

emotionbug commented 1 year ago

Will be fixed with #599 . This patch included in v2.13.1.