グラフデータは内部的には複数のテーブルとして格納されます。グラフデータの探索は、それらのテーブルに対する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)