Skip to content

Querying graphs

DuckGQL lowers graph operations into DuckDB plans, so projection, filtering, joins, sorting, and aggregation use DuckDB's execution engine.

Match a directed relationship

sql
MATCH (person:Person)-[relationship:KNOWS]->(friend:Person)
WHERE person.name = 'Ada'
RETURN friend.name,
       relationship.since
ORDER BY relationship.since DESC
LIMIT 20;

Aggregate

sql
MATCH (person:Person)-[:KNOWS]->(friend:Person)
RETURN person.name,
       COUNT(*) AS friend_count
GROUP BY person
ORDER BY friend_count DESC;

Optional patterns

sql
MATCH (person:Person)
OPTIONAL MATCH (person)-[:KNOWS]->(friend:Person)
RETURN person.name,
       friend.name;

Fixed and bounded paths

sql
MATCH (source:Person)-[:KNOWS]->(middle:Person)-[:KNOWS]->(target:Person)
WHERE source.id = 123
RETURN target.name;
sql
MATCH (source:Person)-[:KNOWS]->{1,3}(target:Person)
WHERE source.id = 123
RETURN DISTINCT target.name
ORDER BY target.name
LIMIT 20;

Path search and composition support is still partial. Review compatibility and limitations before designing around advanced ISO GQL path features.

Explain a query

sql
EXPLAIN MATCH (person:Person)
WHERE person.age >= 35
RETURN person.name;

EXPLAIN ANALYZE MATCH (person:Person)
RETURN person.name;

EXPLAIN (FORMAT JSON) MATCH (person:Person)
RETURN person.name;

DuckGQL first selects graph-specific access paths. DuckDB then costs and executes the resulting relational plan.

DuckGQL is experimental software released under the MIT License.