Question Set
https://meta.linked.archi/archimate4/questions#
Questions ArchiMate 4.0 stakeholders ask of a model — impact of change, application dependencies, data access, responsibilities, realisation and traceability — and the findings that show where a concern the ArchiMate 4.0 viewpoints frame is not met. Each is executable SPARQL (see arch:ModelQuestion).
20 model questions: questions the model answers, each with the SPARQL that answers it, bound to the concerns it informs. A finding question's rows are problems against those concerns: none means they are met.
notation/archimate4/elements-by-domain
?model (optional) — The model to count. A modelling tool binds the open model; a deliverable, the model it is produced from.SELECT ?domain (COUNT(DISTINCT ?element) AS ?elements)
WHERE {
# Each domain's types, read once.
{
SELECT DISTINCT ?domain ?type
WHERE {
VALUES ?domain {
am4:StrategyElement am4:MotivationElement am4:BusinessDomainElement
am4:ApplicationDomainElement am4:TechnologyDomainElement am4:ImplementationAndMigrationDomainElement
am4:CommonDomainElement
}
{ ?domainType rdfs:subClassOf* ?domain } UNION { GRAPH ?ontologyGraph { ?domainType rdfs:subClassOf* ?domain } }
{ ?type rdfs:subClassOf* ?domainType } UNION { GRAPH ?specialisationGraph { ?type rdfs:subClassOf* ?domainType } }
}
}
?element rdf:type ?type ;
arch:inModel ?model .
}
GROUP BY ?domain
ORDER BY DESC(?elements)
notation/archimate4/requirement-traceability
SELECT DISTINCT ?requirement ?requirementLabel ?direction ?predicate ?other ?otherLabel ?otherType
WHERE {
?requirement rdf:type am4:Requirement .
{
?other am4:realizes ?requirement .
BIND(am4:realizes AS ?predicate)
BIND("realised by" AS ?direction)
}
UNION
{
VALUES ?predicate { am4:realizes am4:influences }
?requirement ?predicate ?other .
BIND("contributes to" AS ?direction)
}
?other rdf:type ?otherType .
FILTER(?otherType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?otherType WHERE { { ?otherType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?otherType arch:isAbstractClass true } } } }
OPTIONAL { ?requirement skos:prefLabel ?requirementLabel . FILTER(lang(?requirementLabel) = "" || langMatches(lang(?requirementLabel), "en")) }
OPTIONAL { ?other skos:prefLabel ?otherLabel . FILTER(lang(?otherLabel) = "" || langMatches(lang(?otherLabel), "en")) }
}
ORDER BY ?requirementLabel ?direction ?otherLabel
notation/archimate4/plateau-difference
?from — The earlier plateau, such as the baseline.?to — The later plateau, such as the target.SELECT DISTINCT ?change ?element ?label ?type
WHERE {
{
?from rdf:type am4:Plateau .
?to rdf:type am4:Plateau ;
am4:aggregates|am4:composedOf ?element .
FILTER NOT EXISTS { ?from am4:aggregates|am4:composedOf ?element }
BIND("added" AS ?change)
}
UNION
{
?to rdf:type am4:Plateau .
?from rdf:type am4:Plateau ;
am4:aggregates|am4:composedOf ?element .
FILTER NOT EXISTS { ?to am4:aggregates|am4:composedOf ?element }
BIND("removed" AS ?change)
}
FILTER(?from != ?to)
?element rdf:type ?type .
FILTER(?type NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?type WHERE { { ?type arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?type arch:isAbstractClass true } } } }
OPTIONAL { ?element skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY ?change ?type ?label
notation/archimate4/stakeholder-motivation
SELECT DISTINCT ?stakeholder ?stakeholderLabel ?direction ?predicate ?motivation ?motivationLabel ?motivationType
WHERE {
VALUES ?predicate { am4:associatedWith am4:influences am4:realizes am4:aggregates am4:composedOf }
VALUES ?motivationType {
am4:Stakeholder am4:Driver am4:Assessment am4:Goal am4:Outcome
am4:Principle am4:Requirement am4:Meaning am4:Value
}
?stakeholder rdf:type am4:Stakeholder .
{ ?stakeholder ?predicate ?motivation . BIND("outgoing" AS ?direction) }
UNION
{ ?motivation ?predicate ?stakeholder . BIND("incoming" AS ?direction) }
?motivation rdf:type ?motivationType .
OPTIONAL { ?stakeholder skos:prefLabel ?stakeholderLabel . FILTER(lang(?stakeholderLabel) = "" || langMatches(lang(?stakeholderLabel), "en")) }
OPTIONAL { ?motivation skos:prefLabel ?motivationLabel . FILTER(lang(?motivationLabel) = "" || langMatches(lang(?motivationLabel), "en")) }
}
ORDER BY ?stakeholderLabel ?direction ?motivationLabel
notation/archimate4/work-package-deliverables
SELECT DISTINCT ?workPackage ?workPackageLabel ?deliverable ?deliverableLabel ?realized ?realizedLabel ?realizedType
WHERE {
?workPackage rdf:type am4:WorkPackage ;
am4:realizes ?deliverable .
?deliverable rdf:type am4:Deliverable .
OPTIONAL {
?deliverable am4:realizes ?realized .
?realized rdf:type ?realizedType .
FILTER(?realizedType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?realizedType WHERE { { ?realizedType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?realizedType arch:isAbstractClass true } } } }
OPTIONAL { ?realized skos:prefLabel ?realizedLabel . FILTER(lang(?realizedLabel) = "" || langMatches(lang(?realizedLabel), "en")) }
}
OPTIONAL { ?workPackage skos:prefLabel ?workPackageLabel . FILTER(lang(?workPackageLabel) = "" || langMatches(lang(?workPackageLabel), "en")) }
OPTIONAL { ?deliverable skos:prefLabel ?deliverableLabel . FILTER(lang(?deliverableLabel) = "" || langMatches(lang(?deliverableLabel), "en")) }
}
ORDER BY ?workPackageLabel ?deliverableLabel
notation/archimate4/impact-of-change
?focus — The element that changes. A modelling tool binds the selected element; a deliverable, the element it is produced for.SELECT DISTINCT ?impacted ?label ?type
WHERE {
?focus (am4:serves|am4:realizes|am4:assignedTo|^am4:accesses)+ ?impacted .
FILTER(?impacted != ?focus)
FILTER NOT EXISTS { ?impacted arch:source ?anySource }
?impacted rdf:type ?type .
FILTER(?type NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?type WHERE { { ?type arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?type arch:isAbstractClass true } } } }
OPTIONAL { ?impacted skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY ?type ?label
notation/archimate4/principle-rationale
SELECT DISTINCT ?principle ?principleLabel ?direction ?predicate ?other ?otherLabel ?otherType
WHERE {
VALUES ?predicate { am4:realizes am4:influences am4:associatedWith }
?principle rdf:type am4:Principle .
{ ?principle ?predicate ?other . BIND("outgoing" AS ?direction) }
UNION
{ ?other ?predicate ?principle . BIND("incoming" AS ?direction) }
?other rdf:type ?otherType .
FILTER(?otherType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?otherType WHERE { { ?otherType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?otherType arch:isAbstractClass true } } } }
OPTIONAL { ?principle skos:prefLabel ?principleLabel . FILTER(lang(?principleLabel) = "" || langMatches(lang(?principleLabel), "en")) }
OPTIONAL { ?other skos:prefLabel ?otherLabel . FILTER(lang(?otherLabel) = "" || langMatches(lang(?otherLabel), "en")) }
}
ORDER BY ?principleLabel ?direction ?otherLabel
notation/archimate4/capability-realisation
SELECT DISTINCT ?capability ?capabilityLabel ?realizer ?realizerLabel ?realizerType
WHERE {
?capability rdf:type am4:Capability .
OPTIONAL {
?realizer am4:realizes ?capability ;
rdf:type ?realizerType .
FILTER(?realizerType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?realizerType WHERE { { ?realizerType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?realizerType arch:isAbstractClass true } } } }
OPTIONAL { ?realizer skos:prefLabel ?realizerLabel . FILTER(lang(?realizerLabel) = "" || langMatches(lang(?realizerLabel), "en")) }
}
OPTIONAL { ?capability skos:prefLabel ?capabilityLabel . FILTER(lang(?capabilityLabel) = "" || langMatches(lang(?capabilityLabel), "en")) }
}
ORDER BY ?capabilityLabel ?realizerLabel
notation/archimate4/application-dependencies
SELECT DISTINCT ?provider ?providerLabel ?how ?via ?consumer ?consumerLabel
WHERE {
# From the relationships to their ends, each branch checking its own: never every pair of components.
{
VALUES ?linkType { am4:Serving am4:Flow am4:Triggering }
?via rdf:type ?linkType ;
arch:source ?provider ;
arch:target ?consumer .
?provider rdf:type am4:ApplicationComponent .
?consumer rdf:type am4:ApplicationComponent .
BIND(REPLACE(STR(?linkType), "^.*[#/]", "") AS ?how)
}
UNION
{
?via rdf:type am4:Service ;
am4:serves ?consumer .
?consumer rdf:type am4:ApplicationComponent .
?provider am4:realizes ?via .
?provider rdf:type am4:ApplicationComponent .
BIND("realises a service serving" AS ?how)
}
FILTER(?provider != ?consumer)
OPTIONAL { ?provider skos:prefLabel ?providerLabel . FILTER(lang(?providerLabel) = "" || langMatches(lang(?providerLabel), "en")) }
OPTIONAL { ?consumer skos:prefLabel ?consumerLabel . FILTER(lang(?consumerLabel) = "" || langMatches(lang(?consumerLabel), "en")) }
}
ORDER BY ?providerLabel ?consumerLabel
notation/archimate4/cross-domain-relationships
SELECT ?sourceDomain ?relationshipType ?targetDomain (COUNT(DISTINCT ?relationship) AS ?relationships)
WHERE {
?relationship arch:source ?source ;
arch:target ?target ;
rdf:type ?relationshipType .
FILTER(?relationshipType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?relationshipType WHERE { { ?relationshipType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?relationshipType arch:isAbstractClass true } } } }
?source rdf:type ?sourceType .
?target rdf:type ?targetType .
{
SELECT DISTINCT ?sourceDomain ?sourceType
WHERE {
VALUES ?sourceDomain {
am4:StrategyElement am4:MotivationElement am4:BusinessDomainElement
am4:ApplicationDomainElement am4:TechnologyDomainElement am4:ImplementationAndMigrationDomainElement
}
{ ?sourceDomainType rdfs:subClassOf* ?sourceDomain } UNION { GRAPH ?sourceOntologyGraph { ?sourceDomainType rdfs:subClassOf* ?sourceDomain } }
{ ?sourceType rdfs:subClassOf* ?sourceDomainType } UNION { GRAPH ?sourceSpecialisationGraph { ?sourceType rdfs:subClassOf* ?sourceDomainType } }
}
}
{
SELECT DISTINCT ?targetDomain ?targetType
WHERE {
VALUES ?targetDomain {
am4:StrategyElement am4:MotivationElement am4:BusinessDomainElement
am4:ApplicationDomainElement am4:TechnologyDomainElement am4:ImplementationAndMigrationDomainElement
}
{ ?targetDomainType rdfs:subClassOf* ?targetDomain } UNION { GRAPH ?targetOntologyGraph { ?targetDomainType rdfs:subClassOf* ?targetDomain } }
{ ?targetType rdfs:subClassOf* ?targetDomainType } UNION { GRAPH ?targetSpecialisationGraph { ?targetType rdfs:subClassOf* ?targetDomainType } }
}
}
FILTER(?sourceDomain != ?targetDomain)
}
GROUP BY ?sourceDomain ?relationshipType ?targetDomain
ORDER BY DESC(?relationships)
notation/archimate4/responsibility-assignments
SELECT DISTINCT ?performer ?performerLabel ?performerType ?assignment ?assigned ?assignedLabel ?assignedType
WHERE {
?assignment rdf:type am4:Assignment ;
arch:source ?performer ;
arch:target ?assigned .
?performer rdf:type ?performerType .
?assigned rdf:type ?assignedType .
FILTER(?performerType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
FILTER(?assignedType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?performerType WHERE { { ?performerType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?performerType arch:isAbstractClass true } } } }
MINUS { SELECT DISTINCT ?assignedType WHERE { { ?assignedType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?assignedType arch:isAbstractClass true } } } }
OPTIONAL { ?performer skos:prefLabel ?performerLabel . FILTER(lang(?performerLabel) = "" || langMatches(lang(?performerLabel), "en")) }
OPTIONAL { ?assigned skos:prefLabel ?assignedLabel . FILTER(lang(?assignedLabel) = "" || langMatches(lang(?assignedLabel), "en")) }
}
ORDER BY ?performerLabel ?assignedLabel
notation/archimate4/data-access
SELECT DISTINCT ?accessor ?accessorLabel ?access ?accessKind ?object ?objectLabel ?objectType
WHERE {
VALUES ?accessKind { am4:Access am4:ReadAccess am4:WriteAccess am4:ReadWriteAccess }
?access rdf:type ?accessKind ;
arch:source ?accessor ;
arch:target ?object .
?object rdf:type ?objectType .
FILTER(?objectType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?objectType WHERE { { ?objectType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?objectType arch:isAbstractClass true } } } }
OPTIONAL { ?accessor skos:prefLabel ?accessorLabel . FILTER(lang(?accessorLabel) = "" || langMatches(lang(?accessorLabel), "en")) }
OPTIONAL { ?object skos:prefLabel ?objectLabel . FILTER(lang(?objectLabel) = "" || langMatches(lang(?objectLabel), "en")) }
}
ORDER BY ?objectLabel ?accessKind ?accessorLabel
notation/archimate4/applications-without-technology
?application
?model (optional) — The model to look in. A modelling tool binds the open model; a deliverable, the model it is produced from.SELECT ?application ?label
WHERE {
?application rdf:type am4:ApplicationComponent ;
arch:inModel ?model .
MINUS {
# The technology domain's types, read once.
{
SELECT DISTINCT ?technologyType
WHERE {
{ ?domainType rdfs:subClassOf* am4:TechnologyDomainElement }
UNION { GRAPH ?ontologyGraph { ?domainType rdfs:subClassOf* am4:TechnologyDomainElement } }
{ ?technologyType rdfs:subClassOf* ?domainType }
UNION { GRAPH ?specialisationGraph { ?technologyType rdfs:subClassOf* ?domainType } }
}
}
?technology rdf:type ?technologyType ;
am4:serves|am4:realizes|(am4:realizes/am4:serves) ?application .
}
OPTIONAL { ?application skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY ?label
notation/archimate4/unrealised-capabilities
?capability
?model (optional) — The model to look in. A modelling tool binds the open model; a deliverable, the model it is produced from.SELECT ?capability ?label
WHERE {
?capability rdf:type am4:Capability ;
arch:inModel ?model .
FILTER NOT EXISTS {
?capability (am4:composedOf|am4:aggregates)* ?part .
?realizer am4:realizes ?part .
}
OPTIONAL { ?capability skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY ?label
notation/archimate4/data-never-written
?object
SELECT ?object ?label ?readers
WHERE {
{
SELECT ?object (COUNT(DISTINCT ?reader) AS ?readers)
WHERE {
VALUES ?objectType { am4:DataObject am4:BusinessObject am4:Artifact }
?read rdf:type am4:ReadAccess ;
arch:source ?reader ;
arch:target ?object .
?object rdf:type ?objectType .
}
GROUP BY ?object
}
FILTER NOT EXISTS {
VALUES ?writeKind { am4:WriteAccess am4:ReadWriteAccess am4:Access }
?write rdf:type ?writeKind ;
arch:target ?object .
}
OPTIONAL { ?object skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY DESC(?readers) ?label
notation/archimate4/principles-without-requirements
?principle
?model (optional) — The model to look in. A modelling tool binds the open model; a deliverable, the model it is produced from.SELECT ?principle ?label
WHERE {
?principle rdf:type am4:Principle ;
arch:inModel ?model .
FILTER NOT EXISTS {
?requirement am4:realizes ?principle ;
rdf:type am4:Requirement .
}
OPTIONAL { ?principle skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY ?label
notation/archimate4/unassigned-behaviour
?behaviour
?model (optional) — The model to look in. A modelling tool binds the open model; a deliverable, the model it is produced from.SELECT ?behaviour ?label ?type
WHERE {
VALUES ?type { am4:Process am4:Function }
?behaviour rdf:type ?type ;
arch:inModel ?model .
FILTER NOT EXISTS { ?performer am4:assignedTo ?behaviour }
OPTIONAL { ?behaviour skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY ?type ?label
notation/archimate4/unrealised-requirements
?requirement
?model (optional) — The model to look in. A modelling tool binds the open model; a deliverable, the model it is produced from.SELECT ?requirement ?label
WHERE {
?requirement rdf:type am4:Requirement ;
arch:inModel ?model .
# Realised by a design element: one whose own type is outside the motivation domain.
MINUS {
?realizer am4:realizes ?requirement ;
rdf:type ?realizerType .
FILTER(?realizerType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?realizerType WHERE { { ?realizerType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?realizerType arch:isAbstractClass true } } } }
MINUS {
SELECT DISTINCT ?realizerType
WHERE {
{ ?domainType rdfs:subClassOf* am4:MotivationElement }
UNION { GRAPH ?ontologyGraph { ?domainType rdfs:subClassOf* am4:MotivationElement } }
{ ?realizerType rdfs:subClassOf* ?domainType }
UNION { GRAPH ?specialisationGraph { ?realizerType rdfs:subClassOf* ?domainType } }
}
}
}
OPTIONAL { ?requirement skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY ?label
notation/archimate4/unrealised-services
?service
?model (optional) — The model to look in. A modelling tool binds the open model; a deliverable, the model it is produced from.SELECT ?service ?label
WHERE {
?service rdf:type am4:Service ;
arch:inModel ?model .
FILTER NOT EXISTS { ?realizer am4:realizes ?service }
OPTIONAL { ?service skos:prefLabel ?label . FILTER(lang(?label) = "" || langMatches(lang(?label), "en")) }
}
ORDER BY ?label
notation/archimate4/viewpoint-scope
?viewpoint — A viewpoint. A modelling tool binds the open view's viewpoint; a deliverable, the section's.?model (optional) — The model to look in. A modelling tool binds the open model; a deliverable, the model it is produced from.SELECT ?element (SAMPLE(?anyLabel) AS ?label) ?type (SAMPLE(?anyDefinition) AS ?definition)
(GROUP_CONCAT(DISTINCT ?link; separator = "; ") AS ?outgoing)
WHERE {
{
# Elements of a domain-specific type the viewpoint admits.
{
SELECT DISTINCT ?viewpoint ?type
WHERE {
{ ?viewpoint arch:includesConcept ?admitted } UNION { GRAPH ?admittingGraph { ?viewpoint arch:includesConcept ?admitted } }
{ ?type rdfs:subClassOf* ?admitted } UNION { GRAPH ?hierarchyGraph { ?type rdfs:subClassOf* ?admitted } }
MINUS {
SELECT DISTINCT ?type
WHERE {
{ ?commonType rdfs:subClassOf* am4:CommonDomainElement } UNION { GRAPH ?commonGraph { ?commonType rdfs:subClassOf* am4:CommonDomainElement } }
{ ?type rdfs:subClassOf* ?commonType } UNION { GRAPH ?commonSpecialisationGraph { ?type rdfs:subClassOf* ?commonType } }
}
}
}
}
?element rdf:type ?type ;
arch:inModel ?model .
}
UNION
{
# Elements of a common-domain type the viewpoint admits, connected to one of a domain-specific type it
# admits. The connected elements are found as a set first: per viewpoint, the elements at the other end
# of a relationship from an element of an admitted domain-specific type.
{
SELECT DISTINCT ?viewpoint ?element
WHERE {
{
SELECT DISTINCT ?viewpoint ?anchorType
WHERE {
{ ?viewpoint arch:includesConcept ?anchorAdmitted } UNION { GRAPH ?anchorAdmittingGraph { ?viewpoint arch:includesConcept ?anchorAdmitted } }
{ ?anchorType rdfs:subClassOf* ?anchorAdmitted } UNION { GRAPH ?anchorHierarchyGraph { ?anchorType rdfs:subClassOf* ?anchorAdmitted } }
MINUS {
SELECT DISTINCT ?anchorType
WHERE {
{ ?anchorCommonType rdfs:subClassOf* am4:CommonDomainElement } UNION { GRAPH ?anchorCommonGraph { ?anchorCommonType rdfs:subClassOf* am4:CommonDomainElement } }
{ ?anchorType rdfs:subClassOf* ?anchorCommonType } UNION { GRAPH ?anchorCommonSpecialisationGraph { ?anchorType rdfs:subClassOf* ?anchorCommonType } }
}
}
}
}
?anchor rdf:type ?anchorType .
{ ?connection arch:source ?anchor ; arch:target ?element }
UNION
{ ?connection arch:target ?anchor ; arch:source ?element }
}
}
?element rdf:type ?type ;
arch:inModel ?model .
{
SELECT DISTINCT ?viewpoint ?type
WHERE {
{ ?viewpoint arch:includesConcept ?admitted } UNION { GRAPH ?admittingGraph { ?viewpoint arch:includesConcept ?admitted } }
{ ?type rdfs:subClassOf* ?admitted } UNION { GRAPH ?hierarchyGraph { ?type rdfs:subClassOf* ?admitted } }
{
SELECT DISTINCT ?type
WHERE {
{ ?commonType rdfs:subClassOf* am4:CommonDomainElement } UNION { GRAPH ?commonGraph { ?commonType rdfs:subClassOf* am4:CommonDomainElement } }
{ ?type rdfs:subClassOf* ?commonType } UNION { GRAPH ?commonSpecialisationGraph { ?type rdfs:subClassOf* ?commonType } }
}
}
}
}
}
FILTER NOT EXISTS { ?element arch:source ?anySource }
OPTIONAL { ?element skos:prefLabel ?anyLabel . FILTER(lang(?anyLabel) = "" || langMatches(lang(?anyLabel), "en")) }
OPTIONAL { ?element skos:definition ?anyDefinition . FILTER(lang(?anyDefinition) = "" || langMatches(lang(?anyDefinition), "en")) }
OPTIONAL {
?relationship arch:source ?element ;
arch:target ?other ;
rdf:type ?relationshipType .
FILTER(?relationshipType NOT IN (arch:ModelConcept, arch:Element, arch:QualifiedRelationship))
MINUS { SELECT DISTINCT ?relationshipType WHERE { { ?relationshipType arch:isAbstractClass true }
UNION { GRAPH ?abstractClassGraph { ?relationshipType arch:isAbstractClass true } } } }
OPTIONAL { ?other skos:prefLabel ?otherLabel . FILTER(lang(?otherLabel) = "" || langMatches(lang(?otherLabel), "en")) }
BIND(CONCAT(REPLACE(STR(?relationshipType), "^.*[#/]", ""), " → ",
COALESCE(STR(?otherLabel), STR(?other))) AS ?link)
}
}
GROUP BY ?element ?type
ORDER BY ?type ?label