Перейти к основному содержимому

Одна задача на пяти языках

Этот документ был подготовлен при помощи ИИ

Текст может содержать неточности, устаревшие данные или технические ошибки. Пожалуйста, проверяйте критически важную информацию перед использованием.

Один и тот же вопрос, записанный каждым языком. Везде self — элемент ArchiMate, а в SPARQL — ?self.

Есть ли у элемента имя

ЯзыкВыражение
AQLself.name <> null and self.name.trim().size() > 0
OCLself.name <> null and self.name.size() > 0
EOLself.name.isDefined() and self.name.trim() <> ''
CELself.name != ""
SPARQLASK { ?self archimate:Nameable.name ?name .
     FILTER(STRLEN(STR(?name)) > 0) }

Связан ли элемент хоть с чем-нибудь

ЯзыкВыражение
AQLself.incomingRelationships->notEmpty() or self.outgoingRelationships->notEmpty()
OCLself.incomingRelationships->notEmpty() or self.outgoingRelationships->notEmpty()
EOLnot self.incomingRelationships.isEmpty() or not self.outgoingRelationships.isEmpty()
CELself.incomingRelationships.size() > 0 || self.outgoingRelationships.size() > 0
SPARQLASK {
  { ?r archimate:ArchimateRelationship.source ?self }
  UNION
  { ?r archimate:ArchimateRelationship.target ?self }
}

Имена всего, на что указывает элемент

ЯзыкВыражение
AQLself.outgoingRelationships->collect(r | r.target.name)
OCLself.outgoingRelationships->collect(r | r.target.name)
EOLself.outgoingRelationships.collect(r | r.target.name)
CELself.outgoingRelationships.map(r, r.target.name)
SPARQLSELECT ?name WHERE {
  ?r archimate:ArchimateRelationship.source ?self ;
     archimate:ArchimateRelationship.target ?target .
  ?target archimate:Nameable.name ?name .
}

Операции над коллекциями пишут через -> в AQL и OCL, через точку в EOL и макросами в CEL; SPARQL вместо коллекции возвращает строки.

Задано ли свойство owner ровно один раз

ЯзыкВыражение
AQLself.properties->select(p | p.key = 'owner')->size() = 1
OCLself.properties->select(p | p.key = 'owner')->size() = 1
EOLself.properties.select(p | p.key = 'owner').size() = 1
CELself.properties.exists_one(p, p.key == "owner")
SPARQLASK {
  { SELECT (COUNT(?p) AS ?owners) WHERE {
      ?self archimate:Properties.properties ?p .
      ?p archimate:Property.key "owner" .
  } }
  FILTER(?owners = 1)
}

Обратите внимание на равенство: = в AQL, OCL и EOL, == в CEL, а в SPARQL вместо него сопоставление с образцом.

Как убрать лишний пробел из имени

Модель меняют только два языка, поэтому у этой задачи два ответа.

ЯзыкВыражение
EOLself.name = self.name.trim();
SPARQLDELETE { GRAPH ?g { ?self archimate:Nameable.name ?name } }
INSERT { GRAPH ?g { ?self archimate:Nameable.name ?trimmed } }
WHERE { GRAPH ?g { ?self archimate:Nameable.name ?name }
         BIND(REPLACE(REPLACE(STR(?name), "^\\s+", ""),
                     "\\s+$", "") AS ?trimmed) }

В обновлении вместе с ?self заранее связана переменная ?g — граф модели.

То же самое на AQL, OCL или CEL отклонят там, где требуется изменение, и модель не тронут там, где примут.