From cd85a66c46964ed4354c49a43c86f1cd849fc655 Mon Sep 17 00:00:00 2001 From: Daniel Hernandez Date: Thu, 26 Feb 2026 20:49:35 +0100 Subject: [PATCH] Add schema inspection queries and script. SPARQL queries to list classes and properties, and src/schema.rb CLI to run them against any graph file. Includes bundler/setup for compatibility with Ruby 4.0 without bundle exec. --- queries/list_classes.sparql | 4 ++++ queries/list_properties.sparql | 5 +++++ src/schema.rb | 40 ++++++++++++++++++++++++++++++++++ 3 files changed, 49 insertions(+) create mode 100644 queries/list_classes.sparql create mode 100644 queries/list_properties.sparql create mode 100755 src/schema.rb diff --git a/queries/list_classes.sparql b/queries/list_classes.sparql new file mode 100644 index 0000000..78add55 --- /dev/null +++ b/queries/list_classes.sparql @@ -0,0 +1,4 @@ +SELECT DISTINCT ?class WHERE { + ?s a ?class . +} +ORDER BY ?class diff --git a/queries/list_properties.sparql b/queries/list_properties.sparql new file mode 100644 index 0000000..5fdd548 --- /dev/null +++ b/queries/list_properties.sparql @@ -0,0 +1,5 @@ +SELECT DISTINCT ?property WHERE { + ?s ?property ?o . + FILTER(?property != ) +} +ORDER BY ?property diff --git a/src/schema.rb b/src/schema.rb new file mode 100755 index 0000000..b458e9c --- /dev/null +++ b/src/schema.rb @@ -0,0 +1,40 @@ +#!/usr/bin/env ruby +# frozen_string_literal: true + +# Usage: ruby src/schema.rb TYPE [--graph FILE] +# TYPE: classes | properties +# FILE: path to an RDF/Turtle file (default: last data/graph-*.ttl) + +require 'bundler/setup' +require 'rdf' +require 'rdf/turtle' +require 'sparql' + +type = ARGV.shift +if !%w[classes properties].include?(type) + abort "Usage: ruby src/schema.rb TYPE [--graph FILE]\n TYPE: classes | properties" +end + +graph_file = nil +if ARGV[0] == '--graph' + ARGV.shift + graph_file = ARGV.shift +end + +graph_file ||= Dir.glob(File.join('data', 'graph-*.ttl')).sort.last + +abort "No graph file found." if graph_file.nil? || !File.exist?(graph_file) + +query_file = File.join(__dir__, '..', 'queries', "list_#{type}.sparql") +query = File.read(query_file) + +$stderr.puts "Loading #{graph_file}..." +graph = RDF::Graph.load(graph_file) +$stderr.puts "Loaded #{graph.count} triples." + +solutions = SPARQL.execute(query, graph) + +key = type == 'classes' ? :class : :property +solutions.each do |solution| + puts solution[key].to_s +end