Note

Compared to IFC-LD v0.1, this release:

  • Responds to community requests to reduce the line noise and indirection of IFC-LD instance data.

  • Takes a stronger position on encoding the IFC schema, going so far as to provide a full port of all existing IFC versions from their EXPRESS definitions.

1. Rationale

IFC-LD is a data model and family of serializations designed to support the exchange of information about the built environment. It is interoperable with all existing versions of IFC, while embracing new directions. Practically, IFC-LD aims to "rebase" IFC on linked data, allowing the community to shed its dependency on ISO 10303, including the P21 ("STEP") instance format and EXPRESS schema language. Unlike ifcOWL, IFC-LD provides full support for closed-world schema definition and validation via the SHACL constraint language.

IFC-LD attempts to solve several problems with IFC-based data exchanges:

  1. To avoid use of custom parsers for ISO 10303-21 ("P21") files, IFC-LD defines a trivial instance data model based on the Resource Description Framework (RDF). IFC-LD instance data may be exchanged using any RDF-compatible serialization.

  2. To avoid the need for bespoke data validation tools, IFC-LD replaces EXPRESS with SHACL as the de facto encoding of the IFC schema. Given a SHACL-encoded snapshot of the IFC schema, and an IFC-LD instance population, users can validate the instance population against the schema using any SHACL processor. Users may create their own SHACL definitions to extend IFC, similar to what they do today with IDS.

  3. To support composition, all IFC schema and instance data are treated as independent assets, linked by URIs.

Rebasing IFC on a minimal but complete set of linked data standards is what allows IFC-LD to integrate all existing IFC schemas while supporting new directions.

2. Goals

2.1. Data Addressability

All exchanged data must be unformly addressable, because linking or referencing data requires it have a name. Given the distributed, global nature of the built environment, the most natural namespace for built assets is the web, where shared assets are addressable by URIs.

2.2. Interoperability with ISO 10303

The vast majority of the world’s existing IFC data is encoded as ISO 10303-21 files. It is also the primary serialization existing commercial systems support. To encourage broad adoption of IFC-LD, and to ensure we can migrate existing asset data, interoperability with the Part 21 exchange format is required. Likewise, the EXPRESS encoding of the IFC schema must be replaced with one of equal of greater expressive power.

2.3. Serialization-Agnosticism

Data serializations are tailored towards specific access patterns. As the access patterns for IFC data are open-ended, and IFC intends to be used by many stakeholders over long periods of time, its encoding must remain agnostic to maximize integration and extension opportunities as the software landscape evolves.

2.4. Extensibility

The IFC-LD specification cannot anticipate every need. Instead, it must provide a small set of capabilities that could later be extended. Rather than inventing these extension capabilities from scratch, it can leverage those it builds upon (i.e., RDF, SHACL).

2.5. Minimal Inventiveness

IFC-LD aims to be defined purely in terms of existing ontologies, data models, and standards. No bespoke technologies or data formats should be required for its implementation.

The challenge is to transform the current standards and solutions towards more generic technology bases. This is needed to create the necessary scalability and broaden adoption.
— BuildingSmart Technical Roadmap 2020

3. Design

3.1. Instances

IFC-LD maps P21 instance features directly to RDF, supporting near-lossless conversion between the two. A complete description of the mapping can be found in P21 to IFC-LD Instance Mappings. In summary:

  1. Each P21 instance file is translated to an RDF named graph.

  2. P21 file metadata become property-value pairs on the named graph.

  3. P21 instances become RDF resources. Each instance is assigned a URI by treating its P21 instance number (e.g., #21) as a relative URI to the base URI of the exchange file.

  4. P21 instance properties are indexed by name (e.g., owningapplication), taken from the IFC-LD SHACL schema during conversion.

  5. P21 instance types (e.g., ifcapplication) are converted to the equivalent rdf:type relation.

  6. P21 literals become RDF resources with property rdf:value.

    Note
    IFCDAYINWEEKNUMBER(6)

    is a valid IFC-STEP structured value, so

    @prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
    @prefix ifc: <http://ifc-ld.org/schemas/ifc2x3#> .
    
    []
    	a ifc:dayofweeknumber ;
    	rdf:value 6
    .

    is a valid IFC-LD structured value.

    This approach also allows IFC-LD values to carry arbitrary metadata (e.g., about who declared them or which contexts they are relevant in).

By convention, all IFC-LD type and property names are encoded in lowercase.

Example P21 instances and their IFC-LD equivalents can be found in IFC-LD Instance Examples.

3.2. Schemas

To fulfill its Goals, IFC-LD must adopt a schema language that is:

  • at least as expressive as EXPRESS, including support for types, relations, and closed-world validation

  • serialization-agnostic

  • capable of supporting integration with domain-adjacent data models

SHACL fulfills these requirements, providing a rich schema language backed by a W3C standard with both open and commercial tooling support.

All EXPRESS constructs used in IFC can be encoded in SHACL. Where there is ambiguity, IFC-LD follows these heuristics:

  • Treat all structural parts of the IFC schema as first-class. This maximizes reuse because the same definition (e.g., of a particular property, like owningapplication) can be reused across the schema without duplication. This reduces the size of the schema and cognitive load on those who need to learn it.

  • Treat all values as structured values. This increases the size of serialized instances, but allows schema definitions to be reused across different contexts. It also lets instance values be treated as resources, allowing them to carry additional metadata (e.g., who asserted them, and why).

  • Use logical operations (e.g., sh:and, sh:xone) to model schema composition and selection. Formal inheritance hierarchies are replaced by independent schema definitions joined by logical operations.

Given an IFC-LD instance population and the SHACL encoding of the corresponding IFC schema, the population can be validated against the schema using any conforming SHACL processor. No custom tooling, intermediary data format, or centralized validation service is required.

Table 1. EXPRESS to SHACL Schema Mapping
Express SHACL

Entity

sh:NodeShape

Entity Property

sh:NodeShape (Properties become first-class structured values)

Abstract Entity

dash:abstract flag

Entity Inheritance

sh:AndConstraintComponents

Types

sh:NodeShape targeting an rdf:value structured value

Enumerations

sh:PropertyShapes targeting sh:in

Selects

sh:NodeShape targeting sh:xone

Where Rules

SHACL Rules

Functions

SHACL Functions

Example mappings from IFC-EXPRESS schema definitions to their IFC-LD SHACL equivalents are given below.

3.2.1. Schema Mapping : Types

IfcInductanceMeasure (EXPRESS)
TYPE IfcInductanceMeasure = REAL;
END_TYPE;
IfcInductanceMeasure (SHACL)
ifc:ifcinductancemeasure
    a sh:NodeShape ;
    sh:property [
        sh:datatype xsd:double ;
        sh:maxCount 1 ;
        sh:minCount 1 ;
        sh:path rdf:value
    ] ;
    sh:targetClass ifc:ifcinductancemeasure .

3.2.2. Schema Mapping : Selects

IfcMaterialSelect (EXPRESS)
TYPE IfcMaterialSelect = SELECT
	(IfcMaterialDefinition
	,IfcMaterialList
	,IfcMaterialUsageDefinition);
END_TYPE;
IfcMaterialSelect (SHACL)
ifc:ifcmaterialselect
    a sh:NodeShape ;
    sh:xone (ifc:ifcmaterialdefinition
        ifc:ifcmateriallist
        ifc:ifcmaterialusagedefinition
    ) .

3.2.3. Schema Mapping : Enumerations

IfcReinforcingMeshTypeEnum (EXPRESS)
TYPE IfcReinforcingMeshTypeEnum = ENUMERATION OF
	(USERDEFINED
	,NOTDEFINED);
END_TYPE;
IfcReinforcingMeshTypeEnum (SHACL)
ifc:ifcreinforcingmeshtypeenum
    a sh:NodeShape ;
    sh:property [
        sh:datatype xsd:string ;
        sh:in ("notdefined"
            "userdefined"
        ) ;
        sh:maxCount 1 ;
        sh:minCount 1 ;
        sh:path rdf:value
    ] ;
    sh:targetClass ifc:ifcreinforcingmeshtypeenum .

3.2.4. Schema Mapping : Entities

IfcFillAreaStyleTiles (EXPRESS)
ENTITY IfcFillAreaStyleTiles
 SUBTYPE OF (IfcGeometricRepresentationItem);
	TilingPattern : LIST [2:2] OF IfcVector;
	Tiles : SET [1:?] OF IfcStyledItem;
	TilingScale : IfcPositiveRatioMeasure;
END_ENTITY;
IfcFillAreaStyleTiles (SHACL)
ifc:ifcfillareastyletiles
    a sh:NodeShape ;
    sh:and (ifc:ifcgeometricrepresentationitem
    ) ;
    sh:name "ifcfillareastyletiles"@en ;
    sh:property ifc:tiles, ifc:tilingpattern, ifc:tilingscale ;
    sh:targetClass ifc:ifcfillareastyletiles .

3.2.5. Schema Mapping : Properties

IfcTiles (SHACL)
ifc:tiles
    rdf:ordered false ;
    a sh:PropertyShape ;
    sh:minCount 1 ;
    sh:name "tiles"@en ;
    sh:node ifc:ifcstyleditem ;
    sh:path ifc:tiles .
IfcTilingPattern (SHACL)
ifc:tilingpattern
    rdf:ordered true ;
    a sh:PropertyShape ;
    sh:maxCount 1 ;
    sh:minCount 1 ;
    sh:name "tilingpattern"@en ;
    sh:node dash:ListShape ;
    sh:path ifc:tilingpattern ;
    sh:property [
        sh:maxCount 2 ;
        sh:minCount 2 ;
        sh:node ifc:ifcvector ;
        sh:path ([
                sh:zeroOrMorePath rdf:rest
            ]
            rdf:first
        )
    ] .
IfcTilingScale (SHACL)
ifc:tilingscale
    a sh:PropertyShape ;
    sh:maxCount 1 ;
    sh:minCount 1 ;
    sh:name "tilingscale"@en ;
    sh:node ifc:ifcpositiveratiomeasure ;
    sh:path ifc:tilingscale .

For the IFC-LD SHACL encodings of existing IFC versions, see IFC SHACL Schema Definitions.

3.3. Integration

IFC-LD applies SHACL Rules in a standard pattern to support integration with domain-adjacent data models and ontologies. SHACL Rules may be written for any target ontology, by any number of stakeholders, and only assumes the availability of a SHACL Rules processor and input IFC-LD dataset. SHACL Rules support arbitrary rewriting of the IFC-LD graph, supporting data integration not practical with other approaches.

Automatic Conversion of IFC-LD into Building Topology Ontology using SHACL Rules
#@prefix ifc: <http://ifc-ld.org/schemas/ifc2x3#> .
@prefix mod: <http://ifc-ld.org/profiles/bot/ifc2x3#> .
@prefix bot: <https://w3id.org/bot#> .
@prefix sh: <http://www.w3.org/ns/shacl#> . 
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> . 
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> . 


bot:
	sh:declare [
		sh:prefix "bot" ;
		sh:namespace "https://w3id.org/bot#"^^xsd:anyURI ;
	] .


mod:BotHasBuildingRule
	a sh:NodeShape ;
	sh:targetClass ifc:ifcsite ;
	sh:rule [
		a sh:SPARQLRule ;
		sh:prefixes rdf: ;
        sh:prefixes bot: ;
        sh:prefixes ifc: ;
		sh:construct """
            CONSTRUCT {
                ?site bot:hasBuilding ?building .  
            } WHERE {
                ?site rdf:type ifc:ifcsite . 
                ?relaggregates rdf:type ifc:ifcrelaggregates . 
                ?relaggregates ifc:relatingobject ?site . 
                ?relaggregates ifc:relatedobjects ?building . 
            }
			""" ;
	] 
.

mod:BotHasStoreyRule
	a sh:NodeShape ;
	sh:targetClass ifc:ifcbuilding ;
	sh:rule [
		a sh:SPARQLRule ;
		sh:prefixes rdf: ;
        sh:prefixes bot: ;
        sh:prefixes ifc: ;
		sh:construct """
            CONSTRUCT {
                ?building bot:hasStorey ?storey .  
            } WHERE {
                ?building rdf:type ifc:ifcbuilding . 
                ?relaggregates rdf:type ifc:ifcrelaggregates . 
                ?relaggregates ifc:relatingobject ?building . 
                ?relaggregates ifc:relatedobjects ?storey . 
                ?storey rdf:type ifc:ifcbuildingstorey . 
            }
			""" ;
	] 
.

mod:BotHasSpaceRule
	a sh:NodeShape ;
	sh:targetClass ifc:ifcbuildingstorey ;
	sh:rule [
		a sh:SPARQLRule ;
		sh:prefixes rdf: ;
        sh:prefixes bot: ;
        sh:prefixes ifc: ;
		sh:construct """
			CONSTRUCT {
             ?storey bot:hasSpace ?space .  
            } WHERE {
                ?storey rdf:type ifc:ifcbuildingstorey . 
                ?relaggregates rdf:type ifc:ifcrelaggregates . 
                ?relaggregates ifc:relatingobject ?storey . 
                ?relaggregates ifc:relatedobjects ?space . 
                ?space rdf:type ifc:ifcspace . 
            }
			""" ;
	] 
.

Other target ontologies, like BrickSchema, may be integrated into the IFC-LD ecosystem by writing the appropriate SHACL Rules.

3.4. Extension

IFC-LD’s design inherits from RDF the benefits of associativity. Practically, this means:

  • An IFC-LD graph can be divided into multiple independent subgraphs without loss of information. Conversely, independent IFC-LD subgraphs can composed into a new graph representing their union. This can be done using standard RDF tooling and is particularly useful for use cases where aspects of a built assets are owned by different parties.[1]

Two geographically isolated stakeholders, Alice and Bob, can each make declarations about the same built asset.

Alice’s Model
alice_model:52 a ifc:buildingstorey;
                ifc:globalid [ rdf:value "1s5utE$rDDfRKgzV6jUJTg"];
				ifc:name "S1-F1"
Bob’s Model
bob_model:180 a ifc:buildingstorey;
                ifc:globalid [ rdf:value "1s5utE$rDDfRKgzV6jUJTg"];
				ifc:description "Floor 1"

The two sets of declarations can be composed by querying against their common "Global ID",

CONSTRUCT {
	?entity ?property ?value
} WHERE {
    ?component ifc:globalid ?sval .  
    ?sval rdf:value ?globalId . 
    BIND (URI(CONCAT("http://ifc-ld.org/ids#",?globalId) AS ?entity)) .
    ?component ?property ?value . 
} 

Returning

<http://ifc-ld.org#1s5utE$rDDfRKgzV6jUJTg>
				a ifc:buildingstorey;
                ifc:globalid [ rdf:value "1s5utE$rDDfRKgzV6jUJTg"];
				ifc:name "S1-F1" ;
				ifc:description "Floor 1" .
  • IFC-LD schema definitions can be extended by stakeholders to add context-specific validation requirements. Instead of distinct schema languages for the IFC schema (EXPRESS) and its bespoke, context-specific extensions (IDS), the same open schema language, SHACL, can be used for both.

[We need to] move from bespoke solutions and technology to generic technologies and solutions that are scalable, widely adopted and work in a broad range of tools.
— BuildingSmart Technical Roadmap 2020
By adding a ifc:version sh:node acme:supported_versions triple declaration to a secondary schema, a SHACL validator will check that every IfcApplication version property instance conforms to the custom acme:supported_versions NodeShape and not just ifc:ifclabel defined by IFC.

3.5. Roadmap

At the time of writing, the following IFC-LD tools are reaching MVP status:

  • A one-way EXPRESS to IFC-LD SHACL compiler, based on NIST’s STEPCode.

  • A one-way P21 to IFC-LD instance compiler, available with both CLI and HTTP interfaces. Bidirectional conversion and compilation to secondary formats is next.

All schemas and examples included in this specifications were generated with these tools. Publication of those tools, potentially as part of a "playground", is an area of active work.

IFC-LD’s ability to interoperate with adjacent data models (as shown in Integration) should be taken further. Particularly useful projects include:

  • A one-way IDS to SHACL compiler

  • A one-way set of SPARQL transformations from IFC-LD to brick.

With the baseline IFC-LD schema and modeling methodology established, stronger refactoring of the IFC schema itself can start productively. Easy places to start include:

  • removing property definitions

  • reducing the inconsistent use of (nested) lists

  • writing transformations to adjacent data models that would allow us to deprecate specific IFC entities (e.g., deprecating IfcOwnerHistory in favor of the PROV model).

  • writing tranformations to produce software SDKs directly from IFC-LD schema definitions.

IFC-LD encourages a built asset ecosystem where:

  • shared asset information can be encoded in long-lived, wire-agnostic, open standards.

  • tooling for those standards can be built by the community, and containerized for flexible deployment.

  • vendors align their internal data models to those supported by (or derived from) IFC-LD, and otherwise focus on providing differentiated user experiences to their users.

4. References

4.1. FAQs

4.1.1. How much do I need to know about linked data to use IFC-LD?

Very little. Unless you have a desire to write new schema definitions, or tinker with instance files by hand, no knowledge of RDF, SHACL, or adjacent technologies is necessary. IFC-LD expects the majority of stakeholders will interact with IFC(-LD) through their authoring environments.

Stakeholders wishing to extend IFC-LD, or add new rules for particular use cases, will benefit from learning the basics of the RDF data model, and aspects of SHACL schema language built on top of it. This can be done incrementally, and tooling and templates can be provided to support efficient learning.

4.1.2. How does IFC-LD compare to ifcOWL?

IFC-LD is Like ifcOWL in that it is:

  • based on linked data

  • interoperable (to different degrees) with the existing IFC schema

IFC-ID differs from ifcOWL in that it does not:

  • does not model EXPRESS schema concepts explictly, but instead translates them into their modern SHACL equivalents.

  • encourages use of "closed-world" schema validation over "open-world" inferencing, at least for common use cases. Schema languages like SHACL are more familiar to stakeholders than OWL’s description logics.

IFC-LD tries to package the power of linked data in a framework that’s approachable and open-ended.

4.1.3. Why does IFC-LD recommend schema definitions be defined SHACL? Why not JSON Schema?

In alignment with its Goals, IFC-LD must be remain serialization-agnostic. JSON Schema is applicable only to JSON, which itself is a data serialization format.

SHACL is also a more expressive schema language than JSON Schema. It is not possible to encode the existing IFC schemas in JSON Schema alone.

4.2. P21 to IFC-LD Instance Mappings

Table 2. P21 File - IFC-LD Instance Data Model Mapping
P21 IFC-LD

Exchange File

RDF Named Graph

Header Section

RDF property-value pairs linked to exchange’s named graph URI

Data Section

subject URIs of the named graph

Table 3. P21 Header Section - IFC-LD Mapping
P21 Header Property IFC-LD

file_description.description

dct:description

file_name.name

dct:title

file_name.time_stamp

prov:generatedAtTime

file_name.author

dce:creator

file_name.organization

dce:creator

file_schema

dash:shape

Table 4. P21 Data Types - IFC-LD Mapping
P21 Data Type IFC-LD

Entity

URI

Reference

URI

Boolean

xsd:boolean

Logical

xsd:boolean

Integer

xsd:integer

Real

xsd:double

String

xsd:string

Enumeration

xsd:string

Binary

xsd:hexBinary

Array

rdf:List

Set

RDF triples sharing same subject, predicate

Null

excluded from serialization; present in schema

Derived

excluded from serialization; present in schema

4.3. IFC SHACL Schema Definitions

4.4. IFC-LD Instance Examples

Here’s an example P21 IFC file and its equivalent IFC-LD named graph,serialized in both Turtle and JSON-LD:

Original P21 File

download

ISO-10303-21;
HEADER;
FILE_DESCRIPTION(('ViewDefinition [CoordinationView_V2.0]'),'2;1');
FILE_NAME('0001','2020-11-30T17:44:46',(''),(''),'The EXPRESS Data Manager Version 5.02.0100.07 : 28 Aug 2013','21.0.0.383 - Exporter 21.0.0.383 - IU alternativa 21.0.0.383','');
FILE_SCHEMA(('IFC4x2'));
ENDSEC;

DATA;
#1= IFCORGANIZATION($,'Autodesk Revit 2021 (ESP)',$,$,$);
#5= IFCAPPLICATION(#1,'2021','Autodesk Revit 2021 (ESP)','Revit');
#6= IFCCARTESIANPOINT((0.,0.,0.));
#9= IFCCARTESIANPOINT((0.,0.));
#11= IFCDIRECTION((1.,0.,0.));
#13= IFCDIRECTION((-1.,0.,0.));
#15= IFCDIRECTION((0.,1.,0.));
#17= IFCDIRECTION((0.,-1.,0.));
#19= IFCDIRECTION((0.,0.,1.));
#21= IFCDIRECTION((0.,0.,-1.));
#23= IFCDIRECTION((1.,0.));
#25= IFCDIRECTION((-1.,0.));
#27= IFCDIRECTION((0.,1.));
#29= IFCDIRECTION((0.,-1.));
#31= IFCAXIS2PLACEMENT3D(#6,$,$);
#32= IFCLOCALPLACEMENT(#147,#31);
#35= IFCPERSON($,'','CYPE',$,$,$,$,$);
#37= IFCORGANIZATION($,'','',$,$);
#38= IFCPERSONANDORGANIZATION(#35,#37,$);
#41= IFCOWNERHISTORY(#38,#5,$,.NOCHANGE.,$,$,$,1606175882);
#42= IFCSIUNIT(*,.LENGTHUNIT.,$,.METRE.);
#43= IFCSIUNIT(*,.AREAUNIT.,$,.SQUARE_METRE.);
#44= IFCSIUNIT(*,.VOLUMEUNIT.,$,.CUBIC_METRE.);
#45= IFCSIUNIT(*,.PLANEANGLEUNIT.,$,.RADIAN.);
#46= IFCDIMENSIONALEXPONENTS(0,0,0,0,0,0,0);
#47= IFCMEASUREWITHUNIT(IFCRATIOMEASURE(0.0174532925199433),#45);
#48= IFCCONVERSIONBASEDUNIT(#46,.PLANEANGLEUNIT.,'DEGREE',#47);
#49= IFCSIUNIT(*,.MASSUNIT.,.KILO.,.GRAM.);
#50= IFCDERIVEDUNITELEMENT(#49,1);
#51= IFCDERIVEDUNITELEMENT(#42,-3);
#52= IFCDERIVEDUNIT((#50,#51),.MASSDENSITYUNIT.,$);
#54= IFCDERIVEDUNITELEMENT(#42,4);
#55= IFCDERIVEDUNIT((#54),.MOMENTOFINERTIAUNIT.,$);
#57= IFCSIUNIT(*,.TIMEUNIT.,$,.SECOND.);
ENDSEC;

END-ISO-10303-21;
IFC-LD Graph (Turtle Serialization)

download

@prefix ifc: <http://ifc-ld.org/schemas/ifc4x2#> .
@prefix prov: <http://www.w3.org/ns/prov#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

<http://base.com/guid> prov:generatedAtTime "2020-11-30T17:44:46"^^xsd:dateTime .

<http://base.com/guid#11> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value 1.0 ] [ rdf:value 0.0 ] [ rdf:value 0.0 ] ) .

<http://base.com/guid#13> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value -1.0 ] [ rdf:value 0.0 ] [ rdf:value 0.0 ] ) .

<http://base.com/guid#15> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value 0.0 ] [ rdf:value 1.0 ] [ rdf:value 0.0 ] ) .

<http://base.com/guid#17> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value 0.0 ] [ rdf:value -1.0 ] [ rdf:value 0.0 ] ) .

<http://base.com/guid#19> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value 0.0 ] [ rdf:value 0.0 ] [ rdf:value 1.0 ] ) .

<http://base.com/guid#21> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value 0.0 ] [ rdf:value 0.0 ] [ rdf:value -1.0 ] ) .

<http://base.com/guid#23> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value 1.0 ] [ rdf:value 0.0 ] ) .

<http://base.com/guid#25> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value -1.0 ] [ rdf:value 0.0 ] ) .

<http://base.com/guid#27> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value 0.0 ] [ rdf:value 1.0 ] ) .

<http://base.com/guid#29> a ifc:ifcdirection ;
    ifc:directionratios ( [ rdf:value 0.0 ] [ rdf:value -1.0 ] ) .

<http://base.com/guid#32> a ifc:ifclocalplacement ;
    ifc:placementrelto <http://base.com/guid#147> ;
    ifc:relativeplacement <http://base.com/guid#31> .

<http://base.com/guid#41> a ifc:ifcownerhistory ;
    ifc:changeaction [ rdf:value "nochange"^^xsd:string ] ;
    ifc:creationdate [ rdf:value 1606175882 ] ;
    ifc:owningapplication <http://base.com/guid#5> ;
    ifc:owninguser <http://base.com/guid#38> .

<http://base.com/guid#43> a ifc:ifcsiunit ;
    ifc:name [ rdf:value "square_metre"^^xsd:string ] ;
    ifc:unittype [ rdf:value "areaunit"^^xsd:string ] .

<http://base.com/guid#44> a ifc:ifcsiunit ;
    ifc:name [ rdf:value "cubic_metre"^^xsd:string ] ;
    ifc:unittype [ rdf:value "volumeunit"^^xsd:string ] .

<http://base.com/guid#48> a ifc:ifcconversionbasedunit ;
    ifc:conversionfactor <http://base.com/guid#47> ;
    ifc:dimensions <http://base.com/guid#46> ;
    ifc:name [ rdf:value "degree"^^xsd:string ] ;
    ifc:unittype [ rdf:value "planeangleunit"^^xsd:string ] .

<http://base.com/guid#52> a ifc:ifcderivedunit ;
    ifc:elements <http://base.com/guid#50>,
        <http://base.com/guid#51> ;
    ifc:unittype [ rdf:value "massdensityunit"^^xsd:string ] .

<http://base.com/guid#55> a ifc:ifcderivedunit ;
    ifc:elements <http://base.com/guid#54> ;
    ifc:unittype [ rdf:value "momentofinertiaunit"^^xsd:string ] .

<http://base.com/guid#57> a ifc:ifcsiunit ;
    ifc:name [ rdf:value "second"^^xsd:string ] ;
    ifc:unittype [ rdf:value "timeunit"^^xsd:string ] .

<http://base.com/guid#9> a ifc:ifccartesianpoint ;
    ifc:coordinates ( [ rdf:value 0.0 ] [ rdf:value 0.0 ] ) .

<http://base.com/guid#1> a ifc:ifcorganization ;
    ifc:name [ rdf:value "autodesk revit 2021 (esp)"^^xsd:string ] .

<http://base.com/guid#31> a ifc:ifcaxis2placement3d ;
    ifc:location <http://base.com/guid#6> .

<http://base.com/guid#35> a ifc:ifcperson ;
    ifc:familyname [ rdf:value ""^^xsd:string ] ;
    ifc:givenname [ rdf:value "cype"^^xsd:string ] .

<http://base.com/guid#37> a ifc:ifcorganization ;
    ifc:description [ rdf:value ""^^xsd:string ] ;
    ifc:name [ rdf:value ""^^xsd:string ] .

<http://base.com/guid#38> a ifc:ifcpersonandorganization ;
    ifc:theorganization <http://base.com/guid#37> ;
    ifc:theperson <http://base.com/guid#35> .

<http://base.com/guid#45> a ifc:ifcsiunit ;
    ifc:name [ rdf:value "radian"^^xsd:string ] ;
    ifc:unittype [ rdf:value "planeangleunit"^^xsd:string ] .

<http://base.com/guid#46> a ifc:ifcdimensionalexponents ;
    ifc:amountofsubstanceexponent [ rdf:value 0 ] ;
    ifc:electriccurrentexponent [ rdf:value 0 ] ;
    ifc:lengthexponent [ rdf:value 0 ] ;
    ifc:luminousintensityexponent [ rdf:value 0 ] ;
    ifc:massexponent [ rdf:value 0 ] ;
    ifc:thermodynamictemperatureexponent [ rdf:value 0 ] ;
    ifc:timeexponent [ rdf:value 0 ] .

<http://base.com/guid#47> a ifc:ifcmeasurewithunit ;
    ifc:unitcomponent <http://base.com/guid#45> ;
    ifc:valuecomponent [ rdf:value 0.0174532925199433 ] .

<http://base.com/guid#49> a ifc:ifcsiunit ;
    ifc:name [ rdf:value "gram"^^xsd:string ] ;
    ifc:prefix [ rdf:value "kilo"^^xsd:string ] ;
    ifc:unittype [ rdf:value "massunit"^^xsd:string ] .

<http://base.com/guid#5> a ifc:ifcapplication ;
    ifc:applicationdeveloper <http://base.com/guid#1> ;
    ifc:applicationfullname [ rdf:value "autodesk revit 2021 (esp)"^^xsd:string ] ;
    ifc:applicationidentifier [ rdf:value "revit"^^xsd:string ] ;
    ifc:version [ rdf:value "2021"^^xsd:string ] .

<http://base.com/guid#50> a ifc:ifcderivedunitelement ;
    ifc:exponent [ rdf:value 1 ] ;
    ifc:unit <http://base.com/guid#49> .

<http://base.com/guid#51> a ifc:ifcderivedunitelement ;
    ifc:exponent [ rdf:value -3 ] ;
    ifc:unit <http://base.com/guid#42> .

<http://base.com/guid#54> a ifc:ifcderivedunitelement ;
    ifc:exponent [ rdf:value 4 ] ;
    ifc:unit <http://base.com/guid#42> .

<http://base.com/guid#6> a ifc:ifccartesianpoint ;
    ifc:coordinates ( [ rdf:value 0.0 ] [ rdf:value 0.0 ] [ rdf:value 0.0 ] ) .

<http://base.com/guid#42> a ifc:ifcsiunit ;
    ifc:name [ rdf:value "metre"^^xsd:string ] ;
    ifc:unittype [ rdf:value "lengthunit"^^xsd:string ] .
IFC-LD Graph (JSON-LD Serialization)

download

{
    "@context": {
        "@base": "http://base.com/guid#",
        "@vocab": "http://ifc-ld.org/schemas/ifc4x2#",
        "ifc": "http://ifc-ld.org/schemas/ifc4x2#",
        "rdf": "http://www.w3.org/1999/02/22-rdf-syntax-ns#",
        "xsd": "http://www.w3.org/2001/XMLSchema#",
        "data": "@graph",
        "a": "@type",
        "id": "@id"
    },
    "id": "#",
    "prov:generatedAtTime": "2020-11-30T17:44:46",
    "data": [
        {
            "id": "#31",
            "a": "ifcaxis2placement3d",
            "location": {
                "id": "#6"
            }
        },
        {
            "id": "#47",
            "a": "ifcmeasurewithunit",
            "unitcomponent": {
                "id": "#45"
            },
            "valuecomponent": {
                "rdf:value": {
                    "@value": "0.0174532925199433"
                }
            }
        },
        {
            "id": "#46",
            "a": "ifcdimensionalexponents",
            "amountofsubstanceexponent": {
                "rdf:value": 0
            },
            "electriccurrentexponent": {
                "rdf:value": 0
            },
            "lengthexponent": {
                "rdf:value": 0
            },
            "luminousintensityexponent": {
                "rdf:value": 0
            },
            "massexponent": {
                "rdf:value": 0
            },
            "thermodynamictemperatureexponent": {
                "rdf:value": 0
            },
            "timeexponent": {
                "rdf:value": 0
            }
        },
        {
            "id": "#35",
            "a": "ifcperson",
            "familyname": {
                "rdf:value": ""
            },
            "givenname": {
                "rdf:value": "cype"
            }
        },
        {
            "id": "#49",
            "a": "ifcsiunit",
            "name": {
                "rdf:value": "gram"
            },
            "prefix": {
                "rdf:value": "kilo"
            },
            "unittype": {
                "rdf:value": "massunit"
            }
        },
        {
            "id": "#19",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 1.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#42",
            "a": "ifcsiunit",
            "name": {
                "rdf:value": "metre"
            },
            "unittype": {
                "rdf:value": "lengthunit"
            }
        },
        {
            "id": "#37",
            "a": "ifcorganization",
            "description": {
                "rdf:value": ""
            },
            "name": {
                "rdf:value": ""
            }
        },
        {
            "id": "#48",
            "a": "ifcconversionbasedunit",
            "conversionfactor": {
                "id": "#47"
            },
            "dimensions": {
                "id": "#46"
            },
            "name": {
                "rdf:value": "degree"
            },
            "unittype": {
                "rdf:value": "planeangleunit"
            }
        },
        {
            "id": "#43",
            "a": "ifcsiunit",
            "name": {
                "rdf:value": "square_metre"
            },
            "unittype": {
                "rdf:value": "areaunit"
            }
        },
        {
            "id": "#17",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": -1.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#25",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": -1.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#1",
            "a": "ifcorganization",
            "name": {
                "rdf:value": "autodesk revit 2021 (esp)"
            }
        },
        {
            "id": "#15",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 1.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#54",
            "a": "ifcderivedunitelement",
            "exponent": {
                "rdf:value": 4
            },
            "unit": {
                "id": "#42"
            }
        },
        {
            "id": "#5",
            "a": "ifcapplication",
            "applicationdeveloper": {
                "id": "#1"
            },
            "applicationfullname": {
                "rdf:value": "autodesk revit 2021 (esp)"
            },
            "applicationidentifier": {
                "rdf:value": "revit"
            },
            "version": {
                "rdf:value": "2021"
            }
        },
        {
            "id": "#9",
            "a": "ifccartesianpoint",
            "coordinates": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#41",
            "a": "ifcownerhistory",
            "changeaction": {
                "rdf:value": "nochange"
            },
            "creationdate": {
                "rdf:value": 1606175882
            },
            "owningapplication": {
                "id": "#5"
            },
            "owninguser": {
                "id": "#38"
            }
        },
        {
            "id": "#51",
            "a": "ifcderivedunitelement",
            "exponent": {
                "rdf:value": -3
            },
            "unit": {
                "id": "#42"
            }
        },
        {
            "id": "#50",
            "a": "ifcderivedunitelement",
            "exponent": {
                "rdf:value": 1
            },
            "unit": {
                "id": "#49"
            }
        },
        {
            "id": "#57",
            "a": "ifcsiunit",
            "name": {
                "rdf:value": "second"
            },
            "unittype": {
                "rdf:value": "timeunit"
            }
        },
        {
            "id": "#32",
            "a": "ifclocalplacement",
            "placementrelto": {
                "id": "#147"
            },
            "relativeplacement": {
                "id": "#31"
            }
        },
        {
            "id": "#55",
            "a": "ifcderivedunit",
            "elements": {
                "id": "#54"
            },
            "unittype": {
                "rdf:value": "momentofinertiaunit"
            }
        },
        {
            "id": "#13",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": -1.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#52",
            "a": "ifcderivedunit",
            "elements": [
                {
                    "id": "#50"
                },
                {
                    "id": "#51"
                }
            ],
            "unittype": {
                "rdf:value": "massdensityunit"
            }
        },
        {
            "id": "#44",
            "a": "ifcsiunit",
            "name": {
                "rdf:value": "volumeunit"
            },
            "unittype": {
                "rdf:value": "cubic_metre"
            }
        },
        {
            "id": "#29",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": -1.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#38",
            "a": "ifcpersonandorganization",
            "theorganization": {
                "id": "#37"
            },
            "theperson": {
                "id": "#35"
            }
        },
        {
            "id": "#11",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 1.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#45",
            "a": "ifcsiunit",
            "name": {
                "rdf:value": "planeangleunit"
            },
            "unittype": {
                "rdf:value": "radian"
            }
        },
        {
            "id": "#21",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": -1.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#23",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 1.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#27",
            "a": "ifcdirection",
            "directionratios": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 1.0
                        }
                    }
                ]
            }
        },
        {
            "id": "#6",
            "a": "ifccartesianpoint",
            "coordinates": {
                "@list": [
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    },
                    {
                        "rdf:value": {
                            "@value": 0.0
                        }
                    }
                ]
            }
        }
    ]
}

4.5. Acknowledgements

Created by Devon Sparks (devonsparks.com) with input from members of the BuildingSmart community. IFC-LD is not currently an officially sponsored BuildingSmart International project.

Thanks to the stepcode team for collaboration on supporting pull requests for the STEP P21 parser and answering questions about the design of the STEP EXPRESS parser.


1. https://patterns.dataincubator.org/book/union-graph.html