Improving the GraphQL, JSON and RDF Representations of buildingSmart Data Dictionary
ReferenceDocument, Country, Unit, Language are disconnected from the rest of the schemaRootAt the high level of detail:
Property and ClassificationProperty are very similar, but there’s no inheritance/relation between themPropertyValue and ClassificationPropertyValue are exactly the same, so can be reduced to one entity
Mixture of singular/plural in property names(*)
property/properties, relations, synonyms, countriesOfUse, relatedIfcPropertyNames, etc.
(*) - already discussed at forums.buildingsmart.org
PlantUML is used with soml2puml convertor tool
RootPropertyValue is used by both Property and ClassificationPropertybuildingSMART International started to analyse the suggested improvements
| Status | Count |
|---|---|
| DISMISSED | 6 |
| NEED MORE INFO | 5 |
| SOLUTION IN PROGRESS | 12 |
| SOLVED | 4 |
| TO BE ANALYSED | 21 |
| TO DO | 13 |
| Grand Total | 61 |
Live spreadsheet with status/solution for each of suggested improvements
February 2023: IfcCableSegment in Web UI has URL: https://search.bsdd.buildingsmart.org/Classification/Index/58453
May 2023: IfcCableSegment in Web UI has another URL: https://search.bsdd.buildingsmart.org/Classification/Index/70992

IfcCableSegment has also URI assigned by a data provider:
https://identifier.buildingsmart.org/uri/buildingsmart/ifc-4.3/class/IfcCableSegmentCABLESEGMENT
Non-unique identification violates FAIR Findability principle
F1: (Meta)data are assigned a globally unique and persistent identifier
We have compared three representations returned by the bSDD server:
https://test.bsdd.buildingsmart.org/graphiql/curl https://identifier.buildingsmart.org/uri/buildingsmart/ <domain>/class|prop/<name> andcurl -Haccept:text/turtle \ https://identifier.buildingsmart.org/uri/buildingsmart/ <domain>/class|prop/<name>We selected entities of each class that have the maximum number of filled fields, and compared the results returned by each API.
Almost all bSDD domain URLs now have the same structure: https://identifier.buildingsmart.org/uri/<org>/<domain>-<version>
URIs can be more “hackable”, allowing users to navigate the hierarchy by pruning the URI: https://identifier.buildingsmart.org/uri/<org>/<domain>/<version>
In some cases, the <org> is repeated in the <domain> part
In some cases, the <org> name doesn’t quite mesh with the domain name, perhaps due to the way bSDD allocates <org> identifiers to bSDD contributors
bim-de/DINSPEC91400: the publisher of this spec is DIN (the German standards organization), not the bim-de initiativedigibase/volkerwesselsbv: bimregister.nl news from 2018 suggest that digibase is a new company/initaitive within Volker Wesseldigibase/nen2699: the publisher of this spec is NEN (the Netherlands standards organization), not the digibase company/initiativedigibase/digibasebouwlagen: perhaps the org name digibase should not be repeated as the prefix of the domain bouwlagen (building layers)https://identifier.buildingsmart.org/uri/acca/ACCAtest-0.1
can become
https://identifier.buildingsmart.org/uri/acca/ACCAtest/0.1
A new entity DomainVersion can provide linking all versions of a domain to its master Domain entity.
ID and use a mandatory field id
id, whereas bSDD uses namespaceUrinamespaceUri field, or it is not fully populatedThe key field classificationType specifies the kind of classification.
| c | classificationType | overlaps with entity |
|---|---|---|
| 29 | “DOMAIN” | Domain |
| 18 | “REFERENCE_DOCUMENT” | ReferenceDocument |
E.g., there is the classification with name décret 2011-321 (23/03/2011) from ATALANE/REX-OBJ-1.0 domain and with classificationType=“REFERENCE_DOCUMENT”, that it is not in the list of ReferenceDocuments.
Why is it not a ReferenceDocument entity?
All significant classes should have ID, which in the case of RDF data is the node URL.
However, many bSDD classes don’t have such a field:
Domain, Property, Classification do have namespaceUriCountry, Language, Unit don’t have an ID but have a field (code, isocode) that can be used to make an ID, when prepended with an appropriate prefix.Property and ClassificationProperty are two different classes, but the latter does not have a distinct URL(*) in GraphQL and JSON.ClassificationProperty are not returned separately by the JSON or RDF entity API, but only as part of the respective ClassificationE.g., IfcCableSegment.CABLESEGMENT classification has ACResistance as a ClassificationProperty, but
curl https://identifier.buildingsmart.org/uri/buildingsmart/ifc-4.3/class/IfcCableSegmentCABLESEGMENT/ACResistance
returns
{"":["Classification with namespace URI
'https://identifier.buildingsmart.org/uri/buildingsmart/ifc-4.3/class/IfcCableSegmentCABLESEGMENT/ACResistance' not found"]}
The key attribute propertyValueKind has values COMPLEX and COMPLEX_LIST used in combination with connectedProperties. These key values are defined for Property and ClassificationProperty

connectedPropertyCodes is defined only for PropertyconnectedProperty is used only on 7 Properties (and not ClassificationProperties)connectedPropertyCodes to describe complex properties, some providers have used classifications with the type COMPOSED_PROPERTY.12385 Properties are declared with isDynamic=true
135250 are not.
However, the field dynamicParameterPropertyCode (used to compute the dynamic property) is always empty, so how can one know which “sub-properties” to use?
Additionally, dynamicParameterPropertyCodes is String, but should be [Property], i.e. an array of Properties .
bSDD includes numerous string attributes (codes or URLs) that should be converted to relations (object fields) to improve the connectedness of the bSDD GraphQL graph
| is a classification field (String) | should be |
|---|---|
physicalQuantity |
(New) PhysicalQuantity |
propertySet |
(New) PropertySet |
subdivisionsOfUse |
(New) CountrySubdivision |
version |
(New) DomainVersion |
replaced/(-ing)ObjectCodes |
some kind of objects. Currently they are empty |
Property and ClassificationProperty: have 46 fields in common, differ in only 5 fields:
belongs uniquely to Property |
belongs uniquely to ClassificationProperty |
|---|---|
connectedPropertyCodes (String) |
isRequired (Boolean) |
relations (PropertyRelation) |
isWritable (Boolean) |
predefinedValue (String) |
|
propertySet (String) |
|
symbol (String) |
Since there are no rules on which fields of Property to reuse in ClassificationProperty, the latter type copies most of the fields from the former.
PropertyValuesPropertyValue and ClassificationPropertyValue are structured values with rich fields:code, value, namespaceUri, description, sortNumber
code, value.
This has multiple problems:
description is not filled out)namespaceUri, precluding unique identification.predefinedValueallowedValues store structured values (ClassificationPropertyValue)
However, their “sibling” property predefinedValue holds just a String, which means that even in the future, predefinedValue cannot be an enumeration value identified globally with a URL.
We implemented a lot (but not all) of the improvements suggested above by using the following process:
The results are available at the SPARQL endpoint and in GraphQL
Here are further ideas for improvement:
Property/ClassificationProperty descriptions and create corresponding PropertyValue lists

Funding: ACCORD project, Horizon Europe, grant #101056973
Data: buildingSMART Data Dictionary (Leon van Berlo, Artur Tomczak, Erik Baars)
Powered by:

11th Linked Data in Architecture and Construction Workshop, 15–16 June 2023, Matera, Italy