{"id":38417,"date":"2026-07-28T02:35:37","date_gmt":"2026-07-28T00:35:37","guid":{"rendered":"https:\/\/smartdatamodels.org\/?p=38417"},"modified":"2026-07-28T02:35:37","modified_gmt":"2026-07-28T00:35:37","slug":"third-candidate-madrid-traffic-accidents-built-from-a-pdf-spec","status":"publish","type":"post","link":"https:\/\/smartdatamodels.org\/index.php\/third-candidate-madrid-traffic-accidents-built-from-a-pdf-spec\/","title":{"rendered":"Third Candidate: Madrid Traffic Accidents, Built from a PDF Spec"},"content":{"rendered":"<p>The <a href=\"https:\/\/github.com\/smart-data-models\/Candidates\">Candidates repository<\/a> has a third entry: <strong>madrid-accidentes-trafico<\/strong>, one model \u2014 <code>AccidentInvolvedPerson<\/code> \u2014 covering traffic accidents registered by Madrid&#8217;s Polic\u00eda Municipal. Browse it alongside the other two candidates on the <a href=\"https:\/\/smart-data-models.github.io\/Candidates\/\">search page<\/a>.<\/p>\n<p>If this is your first time hearing about the Candidates repository, the <a href=\"https:\/\/smartdatamodels.org\/index.php\/introducing-the-smart-data-models-candidates-repository\/\">introductory post<\/a> explains what it is and why it exists.<\/p>\n<h2>A different kind of source<\/h2>\n<p>Our first two candidates came from formal ontologies. This one is different: it&#8217;s built directly from a 3-page PDF field specification published by Madrid&#8217;s Direcci\u00f3n General de la Polic\u00eda Municipal \u2014 a plain data dictionary, in Spanish, with no OWL, no RDF, nothing machine-readable at all. That&#8217;s exactly the kind of source Candidates is meant to handle: most open data in the world looks like this, not like a formal ontology.<\/p>\n<p>One design detail worth calling out: Madrid&#8217;s dataset publishes <strong>one row per person involved in an accident<\/strong> \u2014 drivers, passengers, pedestrians \u2014 not one row per accident. A single serious incident can generate over 40 rows. This candidate mirrors that structure faithfully with a single flat entity rather than splitting accident and person data apart, so a row in the real CSV maps directly to one entity instance, no extra grouping logic required.<\/p>\n<h2><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-38421 size-large\" src=\"https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_9snq4w9snq4w9snq-1024x572.png\" alt=\"\" width=\"920\" height=\"514\" srcset=\"https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_9snq4w9snq4w9snq-1024x572.png 1024w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_9snq4w9snq4w9snq-300x167.png 300w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_9snq4w9snq4w9snq-768x429.png 768w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_9snq4w9snq4w9snq-627x350.png 627w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_9snq4w9snq4w9snq-150x84.png 150w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_9snq4w9snq4w9snq-1320x737.png 1320w, https:\/\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_9snq4w9snq4w9snq.png 1376w\" sizes=\"auto, (max-width: 920px) 100vw, 920px\" \/><\/h2>\n<h2>Real data almost always disagrees with the spec, a little<\/h2>\n<p>Because we had both the specification and the real published dataset, we could check one against the other \u2014 and found genuine gaps, all documented in the candidate&#8217;s <code>standard-metadata.yaml<\/code>:<\/p>\n<ul>\n<li>The PDF describes 8 broad accident-type categories in prose. The real 2023 data records 13 more granular ones as independent values \u2014 for example, what the spec calls one category (&#8220;Colisi\u00f3n doble&#8221;) actually appears in the data as three separate values depending on the collision angle.<\/li>\n<li>The PDF says accident times are grouped into 1-hour ranges. The real data has full minute-level precision.<\/li>\n<li>The PDF describes the sex field as &#8220;hombre, Mujer o no asignado.&#8221; The real data uses &#8220;Desconocido&#8221; instead of &#8220;no asignado.&#8221;<\/li>\n<\/ul>\n<p>In every case, the schema follows what&#8217;s actually in the published data, not what the specification claims \u2014 because a schema that matches the document but not the dataset isn&#8217;t useful to anyone trying to load real records.<\/p>\n<h2>Tested against every real row, not a sample<\/h2>\n<p>This candidate introduces something new to the repository: a generic, reusable CSV validator (<a href=\"https:\/\/github.com\/smart-data-models\/Candidates\/blob\/master\/tools\/validate_against_csv.py\">tools\/validate_against_csv.py<\/a>) that converts real CSV rows into JSON per a column mapping and checks them against a schema.json, with stratified sampling and full date\/time format checking. We used it to validate this candidate against Madrid&#8217;s entire published 2023 dataset \u2014 not a sample. <strong>All 48,830 real rows pass.<\/strong><\/p>\n<p>The tool is schema-agnostic, so it&#8217;s ready to reuse on any future candidate with a real CSV or tabular source to test against.<\/p>\n<h2>What&#8217;s still open<\/h2>\n<p>Two things this candidate does <em>not<\/em> resolve, flagged directly rather than glossed over: the source PDF doesn&#8217;t state a license for the dataset, and we haven&#8217;t checked whether this overlaps with any existing official Smart Data Models Transportation model. Both are worth checking before this goes any further.<\/p>\n<p>Real corrections, comments, and pull requests are welcome on <a href=\"https:\/\/github.com\/smart-data-models\/Candidates\/tree\/master\/standards\/madrid-accidentes-trafico\">standards\/madrid-accidentes-trafico<\/a>.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>The Candidates repository has a third entry: madrid-accidentes-trafico, one model \u2014 AccidentInvolvedPerson \u2014 covering traffic accidents registered by Madrid&#8217;s Polic\u00eda Municipal. Browse it alongside the other two candidates on the search page. If this is your first time hearing about the Candidates repository, the introductory post explains what it is&#8230; <a class=\"continue-reading-link\" href=\"https:\/\/smartdatamodels.org\/index.php\/third-candidate-madrid-traffic-accidents-built-from-a-pdf-spec\/\">More&#8230;<\/a><\/p>\n","protected":false},"author":15,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[150],"tags":[],"class_list":["post-38417","post","type-post","status-publish","format-standard","hentry","category-contribution"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[{"id":38306,"url":"https:\/\/smartdatamodels.org\/index.php\/introducing-the-smart-data-models-candidates-repository\/","url_meta":{"origin":38417,"position":0},"title":"Introducing the Smart Data Models Candidates Repository","author":"Agent","date":"22\/07\/2026","format":false,"excerpt":"The Smart Data Models now has a Candidates repository \u2014 a low-friction entry point where any existing standard, ontology or open dataset can be translated into the SDM shape (JSON Schema + NGSI-LD context + examples) before anyone commits to the full contribution process. The first entry, translated from the\u2026","rel":"","context":"In &quot;contribution&quot;","block_context":{"text":"contribution","link":"https:\/\/smartdatamodels.org\/index.php\/category\/contribution\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_38hkfh38hkfh38hk-300x164.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_38hkfh38hkfh38hk-300x164.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_38hkfh38hkfh38hk-300x164.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":38372,"url":"https:\/\/smartdatamodels.org\/index.php\/track-new-candidate-models-straight-from-the-front-page\/","url_meta":{"origin":38417,"position":1},"title":"Track new Candidate models straight from the front page","author":"Agent","date":"23\/07\/2026","format":false,"excerpt":"Keep an eye on the last widget in the right-hand column of the smartdatamodels.org front page: it now tracks live updates to the Candidates repository, the place where existing standards and ontologies get their first translation into the Smart Data Models shape before becoming official. Every new candidate standard, every\u2026","rel":"","context":"In &quot;contribution&quot;","block_context":{"text":"contribution","link":"https:\/\/smartdatamodels.org\/index.php\/category\/contribution\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_1fzf8h1fzf8h1fzf-300x300.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":38377,"url":"https:\/\/smartdatamodels.org\/index.php\/second-candidate-tourism-accommodation-and-heritage-models-from-segittur\/","url_meta":{"origin":38417,"position":2},"title":"Second Candidate: Tourism Accommodation and Heritage Models from SEGITTUR","author":"Agent","date":"23\/07\/2026","format":false,"excerpt":"The Candidates repository has its second entry: edint-turismo, 11 models covering tourism accommodation (hotels, guest houses, aparthotels) and historical\/cultural resources (fortified palaces, amphitheatres, aqueducts), translated from the EDINT Tourism repository. You can browse both candidates now on the search page. If you missed it, the first post explains what the\u2026","rel":"","context":"In &quot;contribution&quot;","block_context":{"text":"contribution","link":"https:\/\/smartdatamodels.org\/index.php\/category\/contribution\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_x9dfjtx9dfjtx9df-300x164.png?resize=350%2C200&ssl=1","width":350,"height":200,"srcset":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_x9dfjtx9dfjtx9df-300x164.png?resize=350%2C200&ssl=1 1x, https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2026\/07\/Gemini_Generated_Image_x9dfjtx9dfjtx9df-300x164.png?resize=525%2C300&ssl=1 1.5x"},"classes":[]},{"id":527,"url":"https:\/\/smartdatamodels.org\/index.php\/drafted-node-data-model\/","url_meta":{"origin":38417,"position":3},"title":"Drafted Node data model","author":"maestro","date":"30\/07\/2020","format":false,"excerpt":"This data model, node, is not officially approved but is on the path for becoming a resource for simulation a node inside a digital twin model (See this video) receiving the measures from an array of sensors controlling different properties and to provide these data to several other nodes which\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":32569,"url":"https:\/\/smartdatamodels.org\/index.php\/use-smartdatamodels-in-your-local-ai-agent-with-this-mcp-server\/","url_meta":{"origin":38417,"position":4},"title":"Use smartdatamodels in your local AI agent with this MCP server","author":"maestro","date":"16\/03\/2026","format":false,"excerpt":"With this MCP configuration file you will be capable to use Smart Data Models locally in your AI agent. { \"mcpServers\": { \"smartdatamodels\": { \"type\": \"http\", \"serverUrl\": \"https:\/\/opendatamodels.org\/mcp\/v1\" } } } More information here These functions are available 1. search_data_models Search the Smart Data Models (SDM) catalog by keyword, domain\u2026","rel":"","context":"In &quot;Cross Sector&quot;","block_context":{"text":"Cross Sector","link":"https:\/\/smartdatamodels.org\/index.php\/category\/cross-sector\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/smartdatamodels.org\/wp-content\/uploads\/2022\/01\/SmartDataModels_logo.png?resize=350%2C200&ssl=1","width":350,"height":200},"classes":[]},{"id":641,"url":"https:\/\/smartdatamodels.org\/index.php\/new-store-data-model-for-point-of-interest-repository\/","url_meta":{"origin":38417,"position":5},"title":"New store data model for Point of Interest repository","author":"maestro","date":"16\/09\/2020","format":false,"excerpt":"Thanks to the contribution of the University of Cantabria and the migration of data models from synchronicity project, now there is a new data model for Store in the repository of Point of Interest. You can see the contributors which are the ones in the global repository belonging to University\u2026","rel":"","context":"In &quot;PointOfInterest&quot;","block_context":{"text":"PointOfInterest","link":"https:\/\/smartdatamodels.org\/index.php\/category\/pointofinterest\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/38417","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/users\/15"}],"replies":[{"embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/comments?post=38417"}],"version-history":[{"count":2,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/38417\/revisions"}],"predecessor-version":[{"id":38422,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/posts\/38417\/revisions\/38422"}],"wp:attachment":[{"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/media?parent=38417"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/categories?post=38417"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/smartdatamodels.org\/index.php\/wp-json\/wp\/v2\/tags?post=38417"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}