Supplementary Archive S1 (final version, 24 October 2026)
"Direct Translation Versus Semantic Reinterpretation in IFC-to-CityGML 3.0 Conversion:
 Assessing Traceability and Quantity Preservation Through RDF Knowledge Graphs"
Jiyoung Kim, Konkuk University (elliekim@konkuk.ac.kr)

1. code/  (Python 3.12; IfcOpenShell 0.8.5, NumPy, Shapely 2.1, lxml, rdflib 7, pandas)
   Current versions (used for the revised manuscript):
   ifc2citygml_paper_v5.py      IFC -> CityGML 3.0 reinterpretation converter; --reference-only writes the reference table
   gml2rdf_paper_v4.py          GML -> RDF transformation (TBox and ABox written separately)
   gml2rdf_rq4_v1.py            one-storey transformation with WKT or structural geometry (RQ4)
   eval_rq123_v3.py             RQ1-RQ3 evaluation (relative, absolute and combined tolerance; suspect reference volumes flagged)
   eval_rq4_v1.py               RQ4 encoding comparison
   run_fuseki_queries_v2.py     query set Q1-Q9 and Q8b/Q9b against Apache Jena GeoSPARQL Fuseki
   fp_extract_v1.py             removes 3D WKT literals before loading into the GeoSPARQL store
   count_polygons_v1.py         polygon and coordinate count of large GML files
   make_table6_fig4_v1.py       reproduces Table 6, Figure 4 and the figures of Section 6.3 from rq2_objects.csv
   output_closed_v1.py          closedness test of the converted geometry, per object
   room_floor_threshold_v1.py   sensitivity of the room net floor area to the normal threshold
   Superseded versions kept for reference: gml2rdf_paper_v3.py (fails on documents with more than about
   10,000 building children), eval_rq123_v1.py (relative criterion only), run_fuseki_queries_v1.py (Q1-Q9).
   Code comments are partly in Korean.

2. fzk_haus/  complete results for the public AC20-FZK-Haus model (IFC4)
   The IFC file is not redistributed; it is available from the KIT IFC examples
   (https://www.ifcwiki.org/index.php?title=KIT_IFC_Examples) and in the repository of the
   direct-translation converter (https://github.com/tum-gis/ifc-to-citygml3, input/).
   citygml/     reinterpretation_cg30p.gml (this study, default configuration)
                direct_translation_cg30.gml (TUM ifc-to-citygml3 0.9.1, options
                  --no-appearances --no-generic-attribute-sets --pset-names-as-prefixes)
                reinterpretation_cg30p_objects.csv / _run.json (per-object log, run summary)
                Both GML files validate against the official CityGML 3.0 XML schemas.
   rdf/tbox/    liris/ unmodified LIRIS CityGML 3.0 ontologies (LGPL 2.1, licence included),
                cgp_ext.ttl auxiliary vocabulary (provenance, quantities, storey membership)
   rdf/abox/    <name>_wkt_features.ttl and <name>_wkt_geometry.ttl for both converters
                (N-Triples syntax; IRIs use the placeholder namespace http://example.org/)
   evaluation/  fzk_reference.csv, rq123/ (RQ1-RQ3 tables and summary, eval_rq123_v1.py),
                rq123_v3/ (the same evaluation with eval_rq123_v3.py: combined criterion, suspect
                reference volumes flagged), rq4/ (ground floor)

3. suseo_aggregated/  aggregated evaluation tables for Suseo Station (no geometry, no object IDs)
   rq1_by_class.csv, rq2_by_class.csv, queries_*.csv (triple store, median of three runs),
   rq4_suseo_ground_floor.json, reinterpretation_conversion_run.json, reinterpretation_rdf_run.json
   --- added in the revision ---
   queries_reinterpretation_v2.csv, queries_direct_translation_v2.csv
                query set Q1-Q9 plus Q8b/Q9b on the triple store (single run, later session;
                the rows of Table 7 for Q8b/Q9b come from these files)
   default_reevaluated/   the submitted station outputs (default = station configuration)
                re-evaluated with eval_rq123_v3.py: summary.json, rq2_by_class.csv. The figures
                reproduce the submitted ones (95.4 % / 95.2 % of 3,649 common objects within the
                combined tolerance; 67.9 / 73.4 m2; 21.8 / 19.6 m3; Q7 82 rows).
   closedness/            output closedness per object (Sections 4.1, 6.3 and 7.3):
                closed_station_configuration.json / _objects.csv (default run, 6,852 objects) and
                closed_no_simplification.json / _objects.csv (run abl_full, 23,861 objects); columns
                guid, cgClass, nPoly, nEdge, nUnbalanced, closedOutput, ifcClass, simplified, closedReference
   floor_threshold_sensitivity.json  net floor area of the 199 rooms under four thresholds (identical)
   controlled_runs/       the three additional conversions of Section 6.6 / Table 9
                nosimp/  curtain walls excluded, prism simplification off
                         (--no-curtainwall --no-simplify)
                cw/      curtain walls retained, simplification on (no switch)
                full/    curtain walls retained, simplification off (--no-simplify);
                         same object set as the direct translation
                each with conversion_run.json (converter log: objects, polygons, GML size, stage
                times, peak memory), rdf_run.json (triples and file sizes), summary.json and
                rq2_by_class.csv (eval_rq123_v3.py, --queries Q7). The direct-translation graph
                is the same in all evaluations.
   The Suseo Station model and object-level data were produced in a research project funded by
   KAIA (Grant RS-2022-00143804) and are available from the corresponding author for peer review
   upon reasonable request.

Typical run (FZK-Haus):
  python code/ifc2citygml_paper_v5.py AC20-FZK-Haus.ifc -o reinterpretation
  python code/ifc2citygml_paper_v5.py AC20-FZK-Haus.ifc --reference-only -o fzk
  python code/gml2rdf_paper_v4.py reinterpretation_cg30p.gml --name fzk_reinterpretation --tbox-dir <LIRIS ttl folder> -o rdf
  python code/eval_rq123_v3.py --reference fzk_reference.csv --ours-csv reinterpretation_cg30p_objects.csv --ours rdf fzk_reinterpretation --tum rdf fzk_direct --geometry --out eval
  python code/make_table6_fig4_v1.py eval/rq2_objects.csv -o fig4.png

Controlled runs (Suseo Station; the station configuration adds --no-curtainwall):
  python code/ifc2citygml_paper_v5.py <station>.ifc --epsg 5186 --shift=-0.978,18.313,0 --no-curtainwall --no-simplify -o abl_nosimp
  python code/ifc2citygml_paper_v5.py <station>.ifc --epsg 5186 --shift=-0.978,18.313,0 -o abl_cw
  python code/ifc2citygml_paper_v5.py <station>.ifc --epsg 5186 --shift=-0.978,18.313,0 --no-simplify -o abl_full
  followed by gml2rdf_paper_v4.py and eval_rq123_v3.py --queries Q7 for each output.
