グラフデータは内部的には複数のテーブルとして格納されます。グラフデータの探索は、それらのテーブルに対するSELECT文として実現されています。そのアクセスプランは通常のSQL文と同じようにEXPLAIN文で確認することができます。
グラフデータは、ノードごとのレコードを持つテーブルと、エッジごとのレコードを持つテーブルで構成され、グラフデータに対応する問合せは、それらのテーブルの結合とフィルタリングによって実現されています。そのためグラフ探索の性能問題に対するアプローチは、結合を含むSELECT文に対するものと同じになります。
例) グラフ探索のアクセスプランを確認する例
SELECT * FROM cypher('new_graph', $$
EXPLAIN (COSTS off) MATCH (:Person {name: 'Daedalus'})-[:FATHER_OF]->(person)
WITH person.name AS name ORDER BY person.name RETURN name
$$) AS (v agtype);
QUERY PLAN
------------------------------------------------------------------------------------------------------------------------------------------------------------------
Sort
Sort Key: (agtype_access_operator(VARIADIC ARRAY[_agtype_build_vertex(person.id, _label_name('25995'::oid, person.id), person.properties), '"name"'::agtype]))
-> Hash Join
Hash Cond: (person.id = _age_default_alias_1.end_id)
-> Append
-> Seq Scan on _ag_label_vertex person_1
-> Seq Scan on "Person" person_2
-> Hash
-> Hash Join
Hash Cond: (_age_default_alias_1.start_id = _age_default_alias_0.id)
-> Seq Scan on "FATHER_OF" _age_default_alias_1
-> Hash
-> Seq Scan on "Person" _age_default_alias_0
Filter: (properties @> '{"name": "Daedalus"}'::agtype)
(14 rows)