jrgemignani commented on issue #562:
URL: https://github.com/apache/age/issues/562#issuecomment-1692210640
@endriux @vladiksun I've looked into this and found a few things worth
pointing out. I will mention that I am no expert on indexes. What follows is
from my understanding of the code underneath and how these commands are
processed. And yes, as I learn and debug more of it, that can change.
It is also worth pointing out that Cypher is its own language and some
things are not directly translatable to SQL and vice versa. Just because
something is possible or done a particular way in SQL doesn't necessarily
translate to it being possible or done that way in Cypher. Just stating the
obvious, just in case.
In the following MATCH command the two pattern matches are not the same. One
is part of the MATCH clause, the other is part of the WHERE clause. The MATCH
selects stuff based on its criteria and then passes it to the WHERE which then
filters out stuff based on its criteria.
`MATCH (u: {key: value}) WHERE u.key = value RETURN u`
When the indexes are applied, they are tested against the clauses, one at a
time, from my understanding. When matching an index to a specific clause, the
components need to match. If you look at the MATCH above, while the pattern
matches are similar, they are not the same. One is done in the MATCH, the other
in the WHERE. MATCH works on a path, WHERE works on an expression. An index for
one won't work for the other.
Comparing the two MATCH commands that you listed, shown below, they also are
not the same. One WHERE is for the id function on v, the other is for the
access operator function on v. You can see this in the EXPLAIN outputs later on.
```
MATCH (v:Visit) where id(v) = 9570149208162305 RETURN v
MATCH (v:Visit) where v.Id = "2f10d37f58b51ffd47777bd988194be7" RETURN v
```
What this means is that you would need to create an index for each of these
WHERE clauses, which is now possible to do.
```
psql-15.4-5432-pgsql=# CREATE INDEX btree_check_id_func ON graph."Visit"
USING BTREE (age_id(_agtype_build_vertex(id, _label_name('16955'::oid, id),
properties)));
CREATE INDEX
psql-15.4-5432-pgsql=#
psql-15.4-5432-pgsql=# CREATE INDEX btree_check_id ON graph."Visit" USING
BTREE (agtype_access_operator(VARIADIC ARRAY[_agtype_build_vertex(id,
_label_name('16955'::oid, id), properties), '"Id"'::agtype]));
CREATE INDEX
psql-15.4-5432-pgsql=#
```
Now both of your queries will run using those indexes.
```
psql-15.4-5432-pgsql=# select * from cypher('graph', $$ explain analyze
MATCH (v:Visit) where id(v) = 9570149208162305 RETURN v $$) as (a agtype);
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------
Bitmap Heap Scan on "Visit" v (cost=139.18..11138.88 rows=5000 width=32)
(actual time=0.078..0.080 rows=0 loops=1)
Recheck Cond: (age_id(_agtype_build_vertex(id, _label_name('16955'::oid,
id), properties)) = '9570149208162305'::agtype)
-> Bitmap Index Scan on btree_check_id_func (cost=0.00..137.93
rows=5000 width=0) (actual time=0.073..0.074 rows=0 loops=1)
Index Cond: (age_id(_agtype_build_vertex(id,
_label_name('16955'::oid, id), properties)) = '9570149208162305'::agtype)
Planning Time: 0.575 ms
Execution Time: 0.196 ms
(6 rows)
psql-15.4-5432-pgsql=# select * from cypher('graph', $$ explain analyze
MATCH (v:Visit) where v.Id = "2f10d37f58b51ffd47777bd988194be7" RETURN v $$) as
(a agtype);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------
Bitmap Heap Scan on "Visit" v (cost=207.18..11206.88 rows=5000 width=32)
(actual time=0.129..0.131 rows=0 loops=1)
Recheck Cond: (agtype_access_operator(VARIADIC
ARRAY[_agtype_build_vertex(id, _label_name('16955'::oid, id), properties),
'"Id"':
:agtype]) = '"2f10d37f58b51ffd47777bd988194be7"'::agtype)
-> Bitmap Index Scan on btree_check_id (cost=0.00..205.93 rows=5000
width=0) (actual time=0.123..0.124 rows=0 loops=1)
Index Cond: (agtype_access_operator(VARIADIC
ARRAY[_agtype_build_vertex(id, _label_name('16955'::oid, id), properties), '"I
d"'::agtype]) = '"2f10d37f58b51ffd47777bd988194be7"'::agtype)
Planning Time: 0.527 ms
Execution Time: 0.256 ms
(6 rows)
psql-15.4-5432-pgsql=#
```
Hopefully, this is helps to clarify the indexes a bit. Again, this is based
on debugging the index matching code.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]