PREFIX composite: PREFIX rdf: PREFIX sxml: PREFIX fn: PREFIX pmo: PREFIX bim: PREFIX gbx: PREFIX xsd: SELECT * { GRAPH { { { [] a gbx:Surface; gbx:id-Surface ?surfaceId ; composite:child [ rdf:type gbx:AdjacentSpaceId; composite:index ?side; gbx:spaceIdRef-AdjacentSpaceId ?face; ]; composite:child [ rdf:type gbx:AdjacentSpaceId; composite:index 1; gbx:spaceIdRef-AdjacentSpaceId ?face1; ]; composite:child [ a gbx:PlanarGeometry; composite:child ?loop; ] LET (?facename := IRI(fn:concat("http://www.bimtoolset.org/ontologies/IntUBE-EnergyBIM-Data.owl#", str(?surfaceId), "_To_", str(?face)))) } UNION { [] a gbx:Surface; composite:child [ rdf:type gbx:AdjacentSpaceId; composite:index ?side; gbx:spaceIdRef-AdjacentSpaceId ?face; ]; composite:child [ rdf:type gbx:AdjacentSpaceId; composite:index 1; gbx:spaceIdRef-AdjacentSpaceId ?face1; ]; composite:child [ a gbx:Opening; gbx:id-Opening ?surfaceId ; composite:child [ a gbx:PlanarGeometry; composite:child ?loop; ]; ] LET (?facename := IRI(fn:concat("http://www.bimtoolset.org/ontologies/IntUBE-EnergyBIM-Data.owl#", str(?surfaceId),"_To_", str(?face)))) } } { SELECT ?loop (COUNT (?points) AS ?max) { GRAPH { ?loop composite:child ?points } } GROUP BY ?loop } ?loop composite:child [ composite:index ?order; a gbx:CartesianPoint ; composite:child [ composite:index 0 ; composite:child [ sxml:text ?valx ]; ]; composite:child [ composite:index 1 ; composite:child [ sxml:text ?valy ]; ]; composite:child [ composite:index 2 ; composite:child [ sxml:text ?valz ]; ]; ]. } GRAPH { ?vertex a bim:Vertex; pmo:hasPart_directly [ bim:x ?valx; bim:y ?valy; bim:z ?valz; ]. ?facename pmo:hasPart_directly ?geometry. ?geometry a bim:FaceGeometryExtended. { { FILTER (?side = 1) . LET (?index := ?order). } UNION { FILTER (?side = 2) LET (?index := ?max - ?order - 1). } } } }