Ex in конструктор: Ex-In — Конструктор сайтов для генерации клиентов и продаж из интернета

Содержание

Ex-In (Bullet/БМ Пуля) — промокод, инструкция, обзор, отзывы. Рейтинг конструкторов сайтов.

Конструктор является платным, однако, для новых пользователей предусматривается бесплатный тестовый период в течение 14 дней. А по промокоду for24_30 вы получите 30 дней бесплатного доступа.

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

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

Основной функционал:
1. Конструктор Landing Page Для каждого пользователя доступен набор готовых бесплатных шаблонов, выбрав один из которых вы можете сразу же приступать к его настройке и редактированию. Кроме того, поддерживается возможность загружать свои шаблоны и изображения.

Ключевой особенностью является гибкость настройки и редактирования. Вы можете изменять абсолютно все параметры и визуальные элементы вашего сайта. Все действия делаются путём перетаскивания и добавления новых элементов в рабочей области, и не представляют собой ничего сложного, процесс чем-то напоминает создание новых папок в операционной системе Windows.

2. Запуск рекламы в Яндекс Директ Внутренний интерфейс даёт возможность настроить рекламную кампанию в сети контекстной рекламы Яндекс Директ непосредственно из вашего аккаунта. Это очень удобно, так как избавляет от дополнительных рутинных действий. Вы можете добавлять новые рекламные кампании, редактировать объявления, добавлять или удалять ключевые слова и многое другое.

3. EMAIL и SMS рассылки Сервис позволяет организовывать автоматические Email и SMS рассылки для ваших клиентов. Функционал сервиса позволяет вводить текст сообщений и сортировать группы получателей. Кроме того, есть система отслеживания эффективности рассылок.

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

5. CRM система Конструктор имеет собственную CRM систему, которая позволяет удобно организовать взаимодействие между сотрудниками, а также получать актуальную статистику продаж и осуществлять контроль конверсии сайта. Кроме того, присутствует огромное количество других функций по ведению клиента и работе с информацией и базами данных.

В дополнительный функционал платформы входят:

  • Интегрируемая система АВ тестирования.
  • Подключение собственных доменов и субдоменов.
  • Инструменты для повышения конверсии: виджеты звонков, формы обратной связи, онлайн консультанты, актуальная статистика заказов и другое.
  • Сервис обратных звонков Callback.

Как зарегистрироваться на на Ex-in?Процесс регистрации очень прост и не представляет никаких сложностей даже для неопытных пользователей интернета.
  1. Переходим на сайт Ex-in.ru и нажимаем на ссылку: “Регистрация”, в правом верхнем углу.


  1. Перед вами возникнет онлайн форма, в которую необходимо ввести свой Email адрес. Обратите внимание на то, что, указав наш промокод for24_30, вы получите целых 30 дней бесплатного тестового периода! 


  1. Следующим шагом вас попросят указать номер вашего мобильного телефона. Сделать это можно введя цифры в специальную онлайн форму. Вы можете пропустить этот шаг нажав на ссылку: “Указать номер телефона позже”.


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


Как создать сайт?

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

Создание сайта в Ex-in, инструкция:

  1. Войдите на сайт Ex-in.ru и нажмите на ссылку: “Создать сайт” (в правом верхнем углу).


  1. Далее перед вами возникнет страница, где первым делом вам необходимо будет указать название вашего сайта, а также выбрать шаблон из предлагаемых вариантов.

Следует отметить что есть несколько разновидностей шаблонов: для лендингов, для интернет магазинов и для магазинов с блогами.  


  1. Выберите подходящий для себя шаблон и нажмите на ссылку: “Выбрать”. (Вы можете просматривать шаблоны перед выбором, нажимая на ссылку: “Посмотреть”.


  1. Следующим шагом вам будет предложено выбрать доменное имя для сайта (регистрация домена второго уровня) и приступить к редактированию вашего сайта. Для начала редактирования просто нажмите на кнопку: “Редактировать страницу”.


  1. Перед вами появится окно визуального редактора сайта, в котором будет отображен ваш сайт и его элементы. Вы можете редактировать все текстовые элементы сайта, просто кликая по ним мышкой.


  1. Используя меню размещённое слева есть возможность добавлять или удалять блоки на сайт.


  1. Закончив процесс редактирования сайта не забудьте сохранить внесённые изменения. Сделать это можно нажав на кнопку “Сохранить”.


Готово! Отредактировав страницу и сохранив изменения, вы создали свой собственный сайт. Как видите, данный процесс не представляет собой ничего сложного и не занимает много времени.

БМ ПУЛЯ — конструктор создания сайтов для бизнеса за 3 минуты бесплатно

Знакомство с пулей произошла у меня примерно в 2016 году, когда блуждая по просторам ютуб я набрел на запись семинара бизнес молодости. Дашкиев уверял, что это просто огонь-идея, подсмотренная ими в Америке. Информация мне сразу зашла, так как задумка была и впрямь очень простой и понятной. Максимально быстро протестировать любую бизнес идею или нишу.

Я сразу же зарегался на тестовом тарифе и действительно, буквально за 5-10 минут сфарганил одноэкранный сайт. Выглядел он конечно очень топорно, жаль не остался скрин-шот, но вполне был готов к приему трафика.

Настроив в течении пары часов яндекс-директ и оставив его на ночную модерацию, уже в первой половине следующего дня я начал получать первые заявки.

Но, все ли так гладко с конструктором БМ Пуля? Давайте разберемся. Ниже привожу сугубо свою оценку этого сервиса, основанную на более чем 3х летней практической работе. Также, в данном материале вы найдете несколько лайф-хаков, которые могут существенно сэкономить ваше время и деньги.

Итак, в атаку

Содержание статьи

  1. Примеры одно-экранных сайтов на БМ Пуля
  2. Пример лэндинга с высокой конверсией
  3. Что мне НЕ понравилось на конструкторе сайтов ex-in (Пуля)
  4. Как принимать оплату через сайт на Бм Пуля
  5. Плюсы онлайн-конструктора ex-in
  6. Несколько полезных лайфхаков
  7. Как получить скидку к тарифу на БМ Пуля?

Примеры одноэкранных лендингов на БМ Пуля (Ex-In)

Когда я увидел, что эта штука работает, то начал активно внедрять ее своим клиентам. Не буду врать, что везде был прям шоколад. Что-то выстреливало ну очень хорошо (конверсия в лиды до 20%), что-то ни очень (2-5%). В основном, это были проекты для бизнеса в сфере бухгалтерских услуг, так как именно в этой нише я работал достаточно долгое время. Клепал я сайты, можно сказать, конвейером.

Пример одноэкранного сайта с фоновым видео

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

Если вы относитесь к тому типу людей, которые предпочитает быстро все попробовать на практике, а не доводить до идеала месяцами, то эта штука однозначно вам понравится.

Из последних успешных моих кейсов, это настройка рекламной кампании по услугам установки кондиционеров в г. Кемерово. Ниша, изначально показалась мне довольно конкурентной, но к удивлению, конверсия в лиды получилась более чем достойной (10-15%).

Соответственно, стоимость привлечения клиентов получилась настолько интересной, что мы успешно клонировали этот проект по другим городам — Новосибирск, Красноярск и Хабаровск.

Сайт был до боли простой и но его создание ушло не многим более 2 часов.

Пример лендинга на БМ Пуля в нише «Установка кондиционеров»

В отличии от предыдущих примеров, здесь был лендинг не на один, а на полтора экрана. К основному оферу мы добавили еще усиливающий блок с брендами по которым компания является официальным дилером. Думаю, это внесло свою лепту в рост конверсии.

Я могу привести еще множество примеров: туры в Карелию, кошельки для криптовалют, услуги перманентного макияжа, продажа производственного оборудование и т.д. Если вам интересны подобные кейсы, рекомендую подписаться на наш дайжест с убойными фишками для бизнеса (форма подписки находится сбоку или в конце этой статьи). Но сейчас,  чтобы сильно не отвлекаться, перейду к описанию достоинств и недостатков конструктора.

Что мне НЕ понравилось в конструкторе сайтов БМ Пуля

  • Ну очень навязчивая реклама в личном кабинете в форме всплывающих окон. Павел Александров — руководитель сего проекта преследует тебя буквально повсюду. Предлагает вписаться на обучение по маркетингу, апгрейдить тариф и т.п. Впрочем, я посетил пару раз такой вебинар. Информация и в заправду очень полезная — разбираются реальные примеры и кейсы. Считаю целесообразным сходить на них, особенно если вы новичок в интернет маркетинге и продажах.
  • Решение вопросов в техподдержке. Если вопрос достаточно простой или плюс минус стандартный, помогают достаточно быстро. А вот если ситуация посложнее, например: что-то глючит, не отображается и т.п. То тут, могут тянуть довольно долго. Причем, у меня есть такое подозрение, что у людей работающих в поддержке установлен KPI именно на скорость реагирования.
    Задав вопрос, ответ получаешь хоть и быстро, но создается впечатление, что дают его ради того чтобы быстрее ответить, а не чтобы решить скорее вопрос. Как и в любом другом сервисе, рекомендую обращаться в поддержку правильно. Не ругаться на эмоциях, а подробно описать ситуацию, приложить скриншоты, расписать варианты того, как уже пытались решить проблему. Тогда и качество ответа будет совсем другим. Справедливости ради хочу отметить, однажды, из-за долгого решения моей проблемы мне дали бонусный промокод на продление срока действия сервиса. Считаю это очень правильным шагом по отношению к клиентам.
  • Убрали возможность отправки заявок на несколько адресов. Так как, большую часть проектов я создаю в конструкторе не для себя, а для клиентов, то логично было бы ставить там для заявок их E mail. Ранее такой функционал был, теперь же, мне приходится настраивать на своем почтовом ящике фильтр, который переадресовывает заявки соответствующим клиентам. Извращение? Да, ну а что остается делать. Писал по этому поводу в техподдержку — безрезультатно.
  • Нет возможности добавить несколько пользователей.
    Это реально обламывает. После стандартизации бизнес-процессов я начал передавать типовые рутинные операции по созданию и поддержке сайтов своим помощникам. Хорошо, что в команде есть надежные люди, кому можно доверить логин и пароль не опасаясь за его сохранность. Но это очень неудобно. Мало ли что произойдет.
  • Возможно не разобрался до конца, но вот делать длинные лендинги на конструкторе хоть и удобно, но с точки зрения дизайна, выглядят они довольно топорно. Вариантов что-то кастомизировать под себя мало. В этом плане, та же Тильда, выглядит куда более интересно. Имхо.
  • Забудьте про SEO. Как и любой конструктор, Ex-in не является исключением. Здесь хоть и присутствуют формальные атрибуты оптимизации как: Title, Discription, Robots txt., но рассматривать его всерьез для продвижения именно в поиске никак нельзя.
  • Пробный период стал меньше. Когда-то, потестить сервис новым пользователям бесплатно, можно было целый месяц, теперь это всего 14 дней. Впрочем, как уже показывал ранее, кто действует быстро, даже 2х недель вполне достаточно чтобы понять оно надо вам или нет.

Прием платежей через Пулю

Решил выделить этот пункт аж в отдельный абзац, так как отношение к этой опции у меня нейтральное. Хорошо или плохо судите сами. Да, я тестировал функцию приема платежей через конструктор. Все ок, работает, удобно, но, мне лично не нравится, что деньги зависают на несколько дней у третьей стороны.

И хотя, деньги на счет мне пришли быстрее чем 14 дней, не знаю, отважился ли я бы прогонять большой оборот через этот сервис. Когда то я использовал для этих целей, Робокассу и признаюсь, чувствовал себя более защищенным. Но это чисто мое субъективное мнение.

Что действительно понравилось

  • Возможность очень быстро протестировать любую бизнес-идею. Буквально: пишешь офер, грузишь фоновую картинку, контакты и какой никакой посадочный лэндос готов. Далее классика. Быстренько грузишь директ по самым горячим фразам, типа «купить+, заказать+, цена+ и т.д., особо не вникая в детали и все. Если повезет с быстрой модерацией в яндексе, реально начать обработку лидов уже через несколько часов с момента идеи! Потом, уже походу процесса докручиваешь рекламную кампанию, сайт и все остальное до идеального состояния.
  • Переадрессация на основной сайт после оставления клиентом заявки. Часто, я использую одноэкранные лендинги даже тогда, когда у клиента есть хороший основной сайт. С помощью таких мини-лэндов мы фокусируем все внимание потенциального клиента на конкретном его запросе. Это объективно повышает конверсию. Далее, когда заявка нами получена, клиент может спокойно полазить по многочисленным страницам основного сайта и если нужно, получить больше информации о компании и т.п.
  • Автоматическое скачивание каталога или коммерческого предложения. Сразу после того, как посетитель оставил заявку, ему предлагается скачать файл с вашей презентацией, каталогом, прайс-листом или коммерческим предложением. По сути, это автоматизация одного из этапов продаж. Конечно, мы в любом случае прозваниваем клиента после заявки. Но узнав, что он уже скачал наше КП на сайте, нам не нужно тратить время на повторную отправку и мы сразу начинаем активно продавать.
  • Простая установка счетчиков и целей. Все устроено таким образом, что ненужно вставлять никаких html кодов. Достаточно скопировать номера метрики и аналитикс. Также удобно, что можно прописать идентификаторы целей для автоматического учета конверсий без программиста.
  • Подсказки и инструкции при создании сайта. Во многих полях уже прописаны примеры. Если вы новичок в маркетинге или у вас слабо с продающим копирайтингом, то ориентируясь на подсказки и видео-инструкции, можно сделать вполне хорошую страницу захвата.
  • Выбор готового шаблона. Очень экономит время. В зависимости от тематики, просто берешь наиболее подходящий и подставляешь туда свои картинки и данные.

Что не успел попробовать

На конструкторе есть еще масса функционала, до которого, что называется, просто не дошли руки. Например:

  •  квизы. Квиз-сайты испытали настоящий бум в интернет маркетинге. К сожалению, я так и не разобрался где и как их настроить в Пуле. Но точно знаю, что их можно  прикрутить с помощью сервиса marquiz — о нем мы расскажем в отдельном обзоре.
  • интеграция с AMO СRM и Битрикс24
  • обратный звонок по типу Колбэкхантер
  • система E mail маркетинга (автоворонки)
  • встроенный кабинет яндекс-директ
  • сквозная аналитика

Поэтому ничего тут сказать не могу. Не пробовал.

Несколько важных лайфхаков

  1. Автоподмена заголовка. Весьма удивительно, что такая опция до сих пор не внедрена на сервис. Это бы добавило жирный плюс как клиентам, так и самим владельцам сервиса. Многочисленные тесты доказали, что сегментация аудитории реально помогает поднять конверсию. Иногда в разы. Но, не так то просто оказалось ее встроить в конструктор. Тем не менее, нам с программистом удалось решить эту проблему через google tag. Так что пользуйтесь, если что.
  2. Зарегистрируйтесь в партнерской программе. Рекомендуя сервис своим клиентам или знакомым, можно получить свой процент и оплатить им свой тариф.
  3. Инструмент для своего бизнеса. На мой взгляд, Пуля это отличный инструмент для начинающих веб-студий и фрилансеров в сфере интернет маркетинга. Сделав запуск буквально за 1 день, можно показать потенциальному клиенту быстрые результаты за очень небольшой прайс. А получив его доверие, уже на порядок проще продавать более сложные продукты — полноценный сайт, SEO и т.д.
Не покупайте конструктор сразу — я знаю как можно сэкономить до 70%

 

Этот лайфхак настолько важный, что я решил выделить его в отдельный абзац, чтобы он не затерялся в списке.

И так, если вы зайдете на сайт пули первый раз, скорее всего вы увидите такую тарифную сетку.

Цены на сервисе по умолчанию указаны в формате «руб в мес.». С маркетинговой точки зрения это выглядит более привлекательным. Поэтому красным я пересчитал их стоимость в год. Не только для понимания, но и для наглядности со следующей картинкой.

  

Откуда этот прайс? А вот. Ранее, я писал о том, что в рамках продвижения сервиса там регулярно проводятся обучающие вебинары. По классике продаж, в конце такого вебинара предоставляется ссылка на специальное предложение.

Как мы видим, тариф бизнес покупать не выгодно, а вот Black Pro можно заполучить с весьма приличной скидкой. Причем, на секретной странице вы увидите таймер, мол предложение истекает завтра. На самом деле оно зациклино. Чтобы счетчик пошел заново, нужно просто почистить кэш или зайти с другого браузера.

Тем не менее, гарантий, что такие цены буду завтра нет. Поэтому если решили, то лучше берите сразу.

И так, порядок действий по регистрации со скидкой
  1. Регистрируйтесь в сервисе по этой ссылке. Но, пока ничего не покупайте!
  2. После регистрации, зайдите на секретную страницу здесь и купите нужный вам тариф со скидкой
  3. Важно! Проверьте, что вам подключили все заявленные опции

Был у меня случай с клиентом, когда вместо заявленных 100 страниц в пакет подключили всего 30. В таком случае, не стесняйтесь писать в техподдержку и требовать подключение всех заявленных функций.

Еще раз, ссылка на сервис БМ Пуля.

На этом позвольте откланяться. Надеюсь с данным конструктором, ваши продажи пойдут наверх и вы напишите свой обзор.

Если вы хотите получать больше фишек и практических инструментов по теме маркетинга и продаж, подписывайтесь на наш еженедельный дайджест. Он точно бесплатный.

Андрей Тараканов

57 конструкторов сайтов на любой вкус.

Друзья, в этой подборке мы собрали для вас 57 конструкторов сайтов, с разных рессурсов. Каждый сможет найти для себя сервис по душе и удобству в использовании. Устраивайтесь по удобнее и вниимайте

  1. 1C-UMI – онлайн-конструктор, позволяющий создавать сайты-визитки, лендинги и магазины. … В ассортименте куча дополнительных платных услуг от разработчиков – от настройки дизайна до наполнения и продвижения сайта по всем направлениям. Цена: от 70 ₽
  2. А5 – это российский конструктор сайтов, который предназначен для создания сайтов-визиток, лендингов и магазинов. В комплект поставки А5 входят около 300 шаблонов, которые разбиты на тематические разделы. Цена: от 50 ₽
  3. Adobe Muse СС — графический редактор, ориентированный на создание сайтов, небольших интернет-магазинов и лендинг пейдж без необходимости написания кода, продукт компании Adobe Systems.
  4. BigCommerce — платформа для электронной коммерции на основе SaaS-технологии. Это один из ведущих зарубежных конструкторов сайтов, с помощью которого можно создать онлайн-магазины, а также лендинги, блоги, рекламные баннеры и скидочные купоны. Цена: от 30$
  5. Bookmark ‒ скромное, но функциональное приложение веб-конструктор, позволяющее своим клиентам создать профессиональный веб-сайт, не приложив к этому никаких усилий. Подойдет для создания мультиязычного веб-сайта или интернет-магазина: в распоряжении пользователей платформа, поддерживающая перевод на 50 языков.
  6. Diafan.Cloud – облачная версия (конструктор сайтов) одной из самых стабильных и мощных CMS. Позволяет создавать большое количество типов сайтов, хотя приоритет стоит на интернет-магазинах. Система модульная, легко масштабируется, даёт доступ к коду, а также содержит интересный визуальный редактор. Цена: от 240 ₽
  7. DudaOne — это конструктор для создания веб-сайта, блога или интернет-магазина. Идеей создания конструктора сайтов Duda послужил смартфон, а именно iPhone компании Apple. это впечатляющий DIY-конструктор сайтов, особенно если вы хотите адаптировать сайт для просмотра на мобильных устройствах.
  8. E-Publish — конструктор для создания сайтов образовательных учреждений. Представляет собой десктопную программу, которая была создана в начале 2000-х. Цена: от 200 ₽
  9. Ex-In.ru — конструктор с визуальным редактором, который можно использовать для создания сайта без навыков программирования. Однако разработчики позиционируют его не как очередной сервис для лендингов или онлайн-магазинов, а как инструмент автоматизации интернет-маркетинга.
  10. Flazio – это итальянский конструктор веб-сайтов, разработанный командой из Сицилии,он нацелен на малый и средний бизнес и фрилансеров, предоставляя пользователям возможность обойти необходимость изучения азов программирования или больших трат, помогая им с легкостью создавать полноценный веб-сайт.
  11. Flexbe – это конструктор лендингов и сайтов, он предлагает создание страниц из готовых блоков на адаптивном дизайне. Целевая аудитория – новички. Разработчики среди прочих преимуществ заявляют быстрый хостинг и эффективную защиту сайтов от DDoS-атак. Цена: от 750  ₽
  12. Fo.ru – современный онлайн сервис для построения сайтов с уникальными функциональными возможностями. Благодаря интуитивно понятному интерфейсу и демократичной ценовой политике он может быть рекомендован новичкам сайтостроения. К недостаткам следует отнести слабый для продвинутых пользователей инструментарий. Цена: от 25 ₽
  13. GoDaddy —  быстрое и простое освоение. Вот только конструктор сайтов GoDaddy не доступен бесплатно, а шаблоны этого сервиса реально устарели. Впрочем, на все это можно закрыть глаза, если вспомнить про шикарную техподдержку сервиса и простоту работы с конструктором. Цена: от 500 ₽ 
  14. Google Sites – сервис для создания и совместного редактирования веб-страниц. Совместим со всеми веб-приложениями Google Apps, среди которых инструменты для редактирования документов, календарь, карты, а также YouTube и прочие продукты компании.
  15. IM Creator — конструктор сайтов с стильными и современными шаблонами, которые заставят любой сайт выглядеть профессионально. У IM Creator нет никаких сильных функций, но с помощью имеющихся доступных инструментов можно легко создать профессиональный веб-сайт.
  16. InSales – платформа для создания небольших и средних интернет-магазинов без помощи программистов, верстальщиков, веб-дизайнеров и других специалистов. Цена: от 700 ₽
  17. Jimdo — простот в использовании и полностью редактируемые дизайнерские шаблоны. Jimdo — это облачный сервис, с помощью которого создавать сайты и управлять ими можно прямо в браузере, а знания HTML, CSS и программирования не требуются. Цена: от 400 ₽
  18. LPGenerator – конструктор для разработки высокоэффективных посадочных страниц. Позиционирование построено вокруг генерации лидов и автоматизации продаж – привлечения новых клиентов и получения прибыли с этого трафика. Цена: от 800 ₽
  19. Mobirise – бесплатная программа для создания адаптивных сайтов. Отличается невероятной простотой редактирования даже на фоне других конструкторов сайтов, отлично подходит начинающим веб-мастерам, которые хотят быстро создать визитку, лендинг или небольшой сайт. Цена: от 19 $
  20. MotoCMS подойдет абсолютно всем, кто желает создать свой классный сайт, будь то веб-разработчик со стажем или обычная домохозяйка. Этот конструктор абсолютно универсален. Главная особенность MotoCMS — это и конструктор сайтов и система управления контентом в одном флаконе. Цена: от 1250 $
  21. Mottor — это конструктор сайтов и лендингов с Drag&Drop-редактором. Содержит шаблоны landing page, созданные с учетом продающих скриптов, готовые секции, из которых можно создать собственный дизайн.
  22. Mozello – конструктор для новичков, подходит для самостоятельного создания сайтов-визиток, блогов и магазинов. Сервис созданный латвийскими разработчиками из компании Blumentals Solutions SIA и переведенный на несколько языков, в числе которых русский. Цена: от 355 ₽
  23. Nethouse – конструктор сайтов для бизнеса от российских разработчиков, который чаще всего используется для создания небольших интернет-магазинов и лендингов.
  24. Okis – это конструктор для создания сайтов-визиток и магазинов, который не использует визуальный редактор для наполнения страниц. В Okis всё будет происходить по-старинке – через милый сердцу текстовый редактор и правку HTML/CSS
  25. One.com — поможет недорого вывести ваш бизнес онлайн One.com не просто конструктор DIY –сайтов. Это хостинговая компания, которая предоставляет возможность создания веб-страниц.
  26. Pixli – это молодой онлайновый конструктор сайтов, вышедший из-под кодинга российских разработчиков. При первом же взгляде на его официальный сайт, созданный на своей же платформе, становится ясно – дело имеешь с серьёзным продуктом.
  27. PlatformaLP – профильный конструктор одностраничников. Система обладает качественным визуальным редактором и хорошим набором готовых шаблонов. Средства анализа и увеличения конверсии прилагаются.
  28. Redham – это коммерческий сайт-конструктор, имеющий 30-дневный бесплатный тестовый период. Аудитория сервиса – предприниматели, готовые заплатить за простоту, удобство и неплохой функционал.
  29. Reg.ru — конструктор сайтов, который позволяет создавать проекты в визуальном редакторе, не имея навыков программирования. Пользователь получает доступ к базе шаблонов и простым инструментам для настройки внешнего вида и функциональности сайта.
  30. Setup вывели на рынок совместными усилиями команды Sape и SeoPult в 2011 году. Ставка делалась на расширенные возможности по продвижению. Дело в том, что с тех пор сервис никак не развивался. Мелкие правки в расчёт не берём. Он позволяет создавать сайты десятилетней моды по дизайну и возможностям. Стоимость на уровне качественных платформ.
  31. Shopify – конструктор от одноименной канадской компании, которая занимается производством программного обеспечения для онлайн и оффлайн-магазинов.
  32. Simbla — шикарные функции, с помощью которых вам будет как никогда просто работать над вашим сайтом. Опытные и продвинутые пользователи наверняка оценят гибкие возможности редактирования и инструменты для создания приложений, тогда как новички наверняка будут очарованы тем, насколько простым может быть создания сайта — достаточно лишь перетаскивать в редактор нужные элементы.
  33. SIMPLE-SITE.COM предназначен для частных лиц, индивидуальных предпринимателей, фрилансеров, владельцев небольших компаний, не имеющих в сети собственного сайта. С его помощью можно в считанные минуты создать сайт с учетом личных пожеланий.
  34. SITE123 – конструктор с для создания сайтов-визиток, компактных магазинов и блогов. Он подходит начинающим пользователям, у которых до этого не было опыта создания сайтов
  35. SiteBuilder доказал, что является топовым конструктором сайтов, который высоко ценят его клиенты. Все начинается с того, что клиент выбирает бесплатный и бессрочный домен, а затем переходит к выбору шаблона из тысячи доступных вариантов.
  36. SquareSpace ‒ известнейший, простой редактор с самыми красивыми шаблонами для бизнеса любой тематики. Полностью настраиваемая и простая в работе платформа, позволяющая начать с блога, а потом легко расшириться до крупного интернет-магазина.
  37. Strikingly — конструктор веб-сайтов, который позволяет пользователю практически без опыта разработки создавать оптимизированные для мобильных устройств веб-сайты в считанные минуты.
  38. Tilda – конструктор, который после запуска позиционировался как сервис для писателей, журналистов, контент-мейкеров. Основной упор шёл на красивую подачу текста в журналистском формате лонгрида, в виде интерактивных историй, фоторепортажей, презентаций и других проектов, ориентированных на контент.
  39. Тинькофф — новый продукт от известного банка, который должен решать задачи бизнеса. Судя по отзывам пользователей, которые применяли его для запуска сайтов, со своим предназначением сервис справляется. Конструктор можно использовать для создания лендингов и многостраничных сайтов
  40. uCoz — бесплатная система управления сайтом и хостинг для сайтов, созданных с её использованием, разработанная компанией uKit Group. Модули uCoz могут использоваться как в единой связке для создания полнофункционального сайта, так и по отдельности, например, в качестве блог-платформы, интернет-магазина и др
  41. Ucraft – это конструктор сайтов, предназначенный для создания визиток, блогов и лендингов как новичками, так и продвинутыми пользователями. Сервис позволяет создавать красивые адаптивные сайты с популярным плоским дизайном и широкоформатными блоками
  42. uKit — это конструктор сайтов для малого бизнеса и предпринимателей, который позволяет без знаний программирования самостоятельно собрать сайт-визитку, портфолио, одностраничник (лендинг пейдж) или интернет-магазин с корзиной и онлайн оплатой.
  43. uLanding — это профессиональный конструктор для создания лендингов с высокой конверсией. Сервис позволяет проводить А/Б тестирования, запускать эксперименты, отслеживать статистику и изучать аналитику для повышения эффективности лендинга.
  44. Vigbo (ранее — Gophotoweb) – это онлайн-конструктор для создания портфолио, блогов и интернет-магазинов. С его помощью можно быстро создать индивидуальный сайт на основании одного из 16 готовых шаблонов, используя разнообразные возможности кастомизации.
  45. Volusion — это конструктор сайтов, позволяющий создавать интернет-магазины с каталогами товаров и базами знаний. Кроме того, реализована функция ведения блогов. Сервис направлен на онлайн-продажи, так как сильной его стороной является наличие профессиональных инструментов для электронной коммерции. При необходимости можно воспользоваться платными услугами дизайнеров для создания уникального онлайн-магазина.
  46. VOOG — это конструктор для создания многоязычных сайтов, интернет-магазинов, визиток, блогов, фотогалерей и форм. За отдельную плату предоставляется регистрация доменов. Управление элементами в редакторе происходит посредством Drag&Drop. Основные достоинства платформы: система статистики, настройки SEO оптимизации, наличие HTML-редактора и интерактивность проектов. В онлайн-магазине реализована продажа как физических, так и цифровых товаров.
  47. WebAsyst — платформа, сочетающая в себе конструктор сайтов и CMS. С помощью “Инсталлера”, можно установить нужные приложения, темы дизайна, плагины и виджеты, тем самым настроив функционал под свои потребности и детализировать настройку системы. Большинство этих возможностей платные. Доступные более 400 плагинов и редактирование HTML кода помогут сделать сайты индивидуальными. Webasyst предлагает регистрацию доменов, облачный хостинг, проведение А/B тестирования, детальную статистику, SEO-оптимизацию и CRM.
  48. Webflow – сервис для профессиональных разработчиков сайтов. По возможностям и формату является смесью Photoshop/Dreamweaver, CMS и конструктора сайтов с WYSIWYG-редактором.
  49. Weblium — это удобный для новичков конструктор сайтов, который поможет вам быстро создать простой, профессионально выглядящий сайт всего за несколько минут. Благодаря его AI Design Supervisor, процесс создания сайта покажется вам таким простым как игра в Лего
  50. Webnode — это мультиязычный конструктор сайтов с управлением элементами посредством Drag-and-Drop. Платформа не требует установки и специальных знаний в сайтостроении, а дружелюбный интерфейс и всплывающие подсказки в редакторе помогут самостоятельно сконструировать сайт даже начинающему пользователю. Для ознакомления с Премиум услугами предоставляется 30 дней, по истечении которых следует принять решение об их необходимости. В этот Премиум пакет входят более 1000 шаблонов, до 20 почтовых адресов, мультиязычность, защита паролем, новостные рассылки и каталог продукции.
  51. WebSite X5 — мультиязычный оффлайн конструктор сайтов. Отличительной особенностью является обязательная установка программы на ПК. Одна лицензия распространяется на два компьютера и не ограничивает число создаваемых сайтов. Регистрация доменов и предоставление хостинга осуществляется через партнёра. Структура оформляемой страницы определяется ячейками, в которые можно вставлять нужные объекты. Возможна продажа не только физических товаров, но и цифровых, наложение водяных знаков для защиты от копирования, SEO оптимизация и аналитика, статистика посещений, анимированные кнопки, якорное меню, параллакс эффект и фавикон.
  52. WebsStarts – сервис, предназначенный для создания и поддержки сайтов, управляется посредством Drag & Drop. Предоставляет возможность создавать сайты-визитки, портфолио, блоги, галереи, слайд-шоу. На базе WebStarts можно размещать фото, тексты и другие элементы, которые будут отображаться на странице. А также интегрировать изображения для редактирования из социальных сетей: Instagram, Facebook, Twitter. На сайте есть возможность зарегистрироваться через Facebook. Система предусматривает использование бесплатной базовой версии, а платная подписка даёт более расширенные возможности. Доступ к статистике требует дополнительной оплаты, что позволит отслеживать эффективность кампании по электронной почте. Площадка на английском языке, русская конфигурация отсутствует.
  53. Webydo — система управления контентом, доступная на 4 языках. Это редактор визуального дизайна, конструктор для создания онлайн-магазинов, а также сайтов-визиток, портфолио, блогов, различных форм и опросов. Интерфейс программы отчасти напоминает Adobe Photoshop с явным ориентированием на дизайнеров, делающих сайты для клиентов без знания кода и привлечения программистов. Сервис предназначен для оказания профессиональных услуг в формате B2B. Для каждого создаваемого проекта Webydo тоже создаёт свою CMS, где веб-дизайнеры сами принимают решение о доступе на редактирование той или иной области для клиента, что позволит не нарушить общий дизайн, но изменит контент. Webydo автоматически конвертирует готовый макет в HTML-код и оптимизирует сайт для просмотра с любых устройств и для поисковых систем.
  54. Weebly – конструкторов от американских разработчиков, созданный в 2007 году. Для создания сайтов на этом сервисе используются разные виджеты, благодаря которым процесс построения страницы в визуальном редакторе выполняется в несколько кликов.
  55. wfolio — это конструктор сайтов для фотографов. Стильный, быстрый, индивидуальный, адаптированный под все устройства и оптимизированный для поисковых систем — таким должен быть сайт фотографа. Продуманный интерфейс позволяет без технических знаний сделать сайт-портфолио и в дальнейшем удобно им управлять
  56. Wix — один из ведущих онлайн конструкторов сайтов, доступный на 11 языках. Отличительной чертой которого является наличие бесплатного тарифа и низкая цена премиум-планов. Управление осуществляется посредством Drag-and-Drop, благодаря чему интерфейс удобен и интуитивно понятен. Платформа предлагает более 500 разнообразных шаблонов HTML5, которые помогут быстро создать качественный сайт любой тематики. Расширить функционал можно с помощью приложений App Market или посредством вставки HTML-кода.
  57. WordPress — это многофункциональная платформа , с открытым исходным кодом, ориентированна на создание блогов, сложных новостных проектов и различных онлайн-публикаций. Также на базе WordPress можно создать интернет-магазины, бизнес-сайты, портфолио, сайты-визитки, форумы и фотогалереи. Главным преимуществом WP является доступность множества тематических шаблонов и плагинов, которые делают платформу универсальной. Так посредством разнообразных тем можно сконструировать нестандартные сайты, например, для поиска работы или продажи недвижимости.

Вывод очень прост, создавайте сайты без заморочек и качайте трафик еще легче. 

Читайте так же в нашем блоге:

Как крео влияет на конверсию

Чертова дюжина. 13 Антидетект браузеров

А/В тестирование лендинга что это и как его проводить?

Баннерная слепота и как ей противостоять

Где создать сайт и как получить самую лучшую интернет площадку?

Наверное вы задаетесь вопросом где создать сайт или у кого заказать данную услугу? Сейчас на рынке большой спрос по этой тематике и поэтому найти web-студию или фрилансера не должно составить особого труда. Остается вопрос, как выбрать лучших или может прибегнуть к различным движкам и заняться конструированием самостоятельно.

Одно из решений это посмотреть рейтинги и отзывы компаний или выбрать специалиста, у которого наиболее привлекательный веб-портал. Если вы все-таки хотите попробовать себя в роли разработчика и не знаете где создать сайт, то попробуйте конструкторы Tilda, Wix, Базиум и Ex-In. Это довольно простые и многофункциональные платформы, которые позволят почувствовать себя разработчиком без навыков программирования.

Попробуйте создать свой собственный сайт на WIX прямо сейчас!

Если же вы в себе уверены и уже знаете тонкости изготовления веб-сайтов, позвольте порекомендовать CMS WordPress и Bitrix. Это серьезные движки, которые позволят сделать отличную и современную веб-площадку. Правда с ними придется немного попотеть и готовьтесь облазить интернет в поисках ответа на будущие вопросы в верстке.

Где лучше создать сайт — на конструкторе или на cms?

Если вы задаетесь вопросом где лучше создать сайт, то я конечно же рекомендую cms. У конструкторов есть большое преимущество в простоте и легкости управления, но все-таки современный движок — это более профессиональный подход.

Правда это не всегда правильно. В некоторых случаях нет необходимости заниматься разработкой ресурса на сложной веб-площадке. Бывает, что достаточно просто создать сайт на конструкторе. И большинство моих клиентов просят именно этого. Им просто не нужна сложная структура и возможности cms. А платформа типа wix, позволяет реализовать тот самый проект, который они так хотели.

Где лучше создать сайт учителя?

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

Наиболее простой из них, это wix. Чуть сложнее, но не хуже tilda, ex-in и базиум. Серьезные cms на первоначальном этапе я рекомендую не трогать.

Уверен, у вас получится, но если возникнут трудности или вы почувствуете, что не справляетесь, свяжитесь со мной. Я непременно помогу создать сайт учителя и у вас будет собственная интернет визитка или портфолио.

Где создать сайт и не заниматься самостоятельной разработкой

Где лучше всего создать сайт, чтобы не заниматься разработкой самостоятельно? Если вы ищите человека, который сделает вам сайт быстро, качественно и недорого — обратитесь к частному мастеру. Я занимаюсь практически всеми видами услуг, включая продвижение. При необходимости я могу разобрать ошибки уже имеющегося у вас интернет-портала и подготовить стратегию вашей будущей рекламной кампании.

Если вы все еще думаете где лучше создать сайт, посмотрите мое портфолио. Я делаю самые разные тематические ресурсы и уверен, что смогу помочь и вам в реализации вашего веб-проекта.

Конструкторы сайтов. Программы, позволяющие быстро сделать сайт

Сервисы создания сайтов — 30 конструкторов сайтов и сервисов (seocatalogs.info/builders/)

Аннотированный список лучших конструкторов сайтов (в блоге на ЛиРу) 
Описано 13 сервисов.

===

123sait

123sait.ru — удобный констрeктор сайтов
Компания 123sait основана в 2003 году в Копенгагене (Дания), чтобы создать .  
наиболее удобный и понятный конструктор веб-сайтов из всех доступных на рынке.

Free Website Builder — Site 123
Создать сайт бесплатно (ru.site123.com)

Atilekt

cms.atilekt.com

Atilekt.ru

Ex-in

Ex-in.online
Конструктор сайтов Ex-In заменяет вам:
— менеджеров по продажам;
— маркетологов и директологов;
— программистов.
Создай сайт и получи клиентов и продажи бесплатно.

Fo.ru 

Fo.ru — конструктор сайтов. Бесплатное продвижение. Интеграция с соцсетями. Публикация приложений.

Jimdo

ru.jimdo.com — удобная и простая платформа для создания собственного сайта

Moto CMS HTML

Moto CMS HTML шаблоны (на саqте Templatemonster. com) 
—  профессиональные сайты, выполненные в технологии HTML, управлять которыми вы сможете через удобную персональную административную панель, стоимость которой уже включена в общую цену за шаблон

Onsite

Onsite.ru — профессиональный конструктор сайтов

Parallels Plesk Sitebuilder

Конструктор сайтов «Parallels Plesk Sitebuilder» — на хостинге Reg.ru 

Сайткрафт Студия 7

Sitecraft.ru — официальный сайт

Сайтменеджер

Site-manager.ru — официальная страница  

Сайтодром

Saitodrom.ru — конструктор сайтов «Сайтодром» 

Tilda

Tilda.cc/ru/ (tilda.ws)
Создайте впечатляющий сайт на Tilda для бизнеса и медиа.
450+ профессиональных блоков готовы для вашего сайта и интернет-магазина

Ucoz

Ucoz.ru — бесплатный конструктор сайтов 

Website X5 Evolution

Websitex5. com

Movavi.ru — сайт разработчика

Incomedia.eu/en/

Wix

ru.wix.com — бесплатный конструктор сайтов. Бесплатный хостинг 
Новые возможности HTML5 для вашего сайта.

Xara Web Designer

Xara-web.ru — официальный русскоязычный сайт 

Хara.com/us/products/webdesigner/ — официальный американский сайт (на англ.языке)

Xara Web Designer – верстка самых сложных веб-страниц без лишних усилий (soft.mail.ru)
К уникальным возможностям пакета Xara Web Designer можно отнести и автоматическую подгонку размера графических элементов под вводимый текст.

Xara Designer — Википедия
Xara Designer (ранее — Artworks, Xara Studio, CorelXARA!, Xara X, Xara X¹, Xara Xtreme) — векторный графический редактор. Последняя версия — Xara Designer 7 — выпущена в июне 2011 года.

Сергей Карякин показал багги-конструктор, разработанный для серьёзных автоспортсменов

Категория: Новости ралли-рейдов
Просмотров: 1747

Основатель команды Snag Racing, победитель ралли «Дакар», ралли «Шелковый путь», этапов Кубка мира, чемпион страны, Сергей Карякин, на видео обстоятельно представил киткар, полностью соответствующий требованиям FIA по категориям Т3/Т4 и годный для участия в чемпионате мира, ралли Dakar, Silk Way Rally и прочих крупных соревнованиях.

Как и положено «конструктору», каждый покупатель может подобрать необходимый набор опций, удовлетворяющий личным требованиям и бюджету. «Представьте, что вы приходите в автосалон и к понравившейся вам модели добираете нужные именно вам опции. Тоже самое вы можете сделать и с нашей багги», – пишет Сергей на своей странице в Фейсбуке. Чтобы наглядно показать отличия базовой версии от «богатой», на видео каркас мотовездехода как бы поделили пополам, оборудовав одну половину различными опциями.

Вариант базовой комплектации включает:

  • полностью омологированная по правилам FIA рама
  • все необходимые документы, подтверждающие данную омологацию
  • алюминиевый пол
  • защита кардана
  • омологированный топливный бак
  • рамка для сидений
  • алюминиевая крыша
  • защита двигателя
  • крепление для запасного колеса
  • крепление крыльев
  • противопожарная перегородка

Дополнительно можно установить более 80 позиций, включая:

  • вынос радиатора назад (радиатор в три раза больше стандартной комплектации)
  • перенос интеркулера
  • воздушный кожух
  • алюминиевые двери
  • алюминиевые закрылки
  • печку
  • кондиционер
  • лобовое стекло
  • сиденья и ремни безопасности
  • рычаги подвески
  • передний алюминиевый подрамник

Желающий приобрести это «конструктор» получит файл-конфигуратор, где можно выбрать необходимые опции и посмотреть как это выглядит. Отдельно Сергей подчеркивает, что все детали взаимозаменяемы: «Также отмечу, что эта концепция уникальна – она позволяет устанавливать взаимозаменяемые детали от производителей при желании заказчика».

Напомним, 2 недели назад Сергей Карякин выставил на продажу свой личный автомобиль, собранный в Германии по спецзаказу, чтобы наскрести денег на взнос за участие в очередном «Дакаре».

Комментарии для сайта Cackle

Игрушки оптом | Дропшиппинг | ПРЯМЫЕ ДИСТРИБЬЮЦИИ

Игрушки оптом

У нас можно купить игрушки оптом. Украинский дистрибьютор, оптовая компания поставщик игрушек, прямой импорт и собственные торговые марки. Гарантия качества, сертифицированные детские игрушки с документами, гарантийное обслуживание, собственные сервисные центры в Украине. Мы эксперты в продаже игрушек гаджетов, радиоуправляемых, электронных и детских развивающих игрушек оптом, радиоуправляемых моделей от среднего до премиум класса. Оптовая продажа игрушек сопровождается консультацией и поддержкой на всех этапах. Ассортимент около 1000 игрушек, более 50 торговых марок, 15 категорий. Наш ассортимент включает в себя такие товарные группы, как радиоуправляемые игрушки, детская безопасная электроника, товары для детского творчества, развивающие игрушки для малышей, куклы, детские музыкальные инструменты, конструкторы. Игрушки производства США, Германия, Испания, Италия, Тайвань, Китай. Наши торговые марки сопровождаются маркетинговой поддержкой. Мы предлагаем купить игрушки оптом со склада Днепр и Киев, или доставку по Украине Новой почтой.

Получить предложение

Игрушки дропшиппинг

Игрушки и детская электроника дропшиппинг: выгрузки XML, YML, контент для Prom, Rozetka и других популярных маркетплейсов. Оперативная прямая отгрузка в день заказа на конечного покупателя с нашего оптового склада игрушек. Надежный оптовый поставщик игрушек для интернет магазинов: актуальные остатки в разрезе оптовых складов онлайн в реалтайм, синхронизация цен и остатков между интернет магазином и нашим оптовым сайтом игрушек для B2B. Качественные игрушки: качество детских товаров подтверждено декларациями соответствия. Гарантия, обмен и возврат. Заказ от 1 единицы. Контроль рекомендованных розничных цен. Тексты, описания, ключевые слова, фото, видео, характеристики, комплектация, что дополнительно необходимо докупить, преимущества детских товаров для конечных покупателей.

Зарегистрироваться в B2B

RegExp — JavaScript | MDN

Буквальная нотация и конструктор

Существует два способа создания объекта RegExp : буквальная нотация и конструктор .

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

Следующие три выражения создают один и тот же объект регулярного выражения:

  пусть re = / ab + c / i;
пусть re = new RegExp ('ab + c', 'i')
пусть re = new RegExp (/ ab + c /, 'i')
  

Буквальная запись приводит к компиляции регулярного выражения при вычислении выражения.Используйте буквальную нотацию, если регулярное выражение останется постоянным. Например, если вы используете буквальную нотацию для построения регулярного выражения, используемого в цикле, это регулярное выражение не будет перекомпилироваться на каждой итерации.

Конструктор объекта регулярного выражения — например, new RegExp ('ab + c') — приводит к компиляции регулярного выражения во время выполнения. Используйте функцию-конструктор, если вы знаете, что шаблон регулярного выражения будет изменяться, или если вы не знаете шаблон и получаете его из другого источника, например из пользовательского ввода.

Флаги в конструкторе

Начиная с ECMAScript 6, new RegExp (/ ab + c /, 'i') больше не генерирует TypeError ( "не может предоставить флаги при построении одного RegExp из другого" ), когда первым аргументом является RegExp , а вторым flags аргумент присутствует. Вместо этого создается новое RegExp из аргументов.

При использовании функции конструктора необходимы обычные правила перехода строки (предшествующие специальные символы с \ при включении в строку).

Например, следующие эквиваленты:

  пусть re = / \ w + /
пусть re = new RegExp ('\\ w +')
  

Perl-подобные свойства RegExp

Обратите внимание, что некоторые из RegExp свойств имеют как длинные, так и короткие (похожие на Perl) имена. Оба имени всегда относятся к одному и тому же значению. (Perl — это язык программирования, на основе которого JavaScript смоделировал свои регулярные выражения.). См. Также устаревшие свойства RegExp .

Использование регулярного выражения для изменения формата данных

Следующий скрипт использует метод replace () экземпляра String для сопоставления имени в формате первый последний и вывода его в формате последний, первый .

В тексте замены сценарий использует $ 1 и $ 2 , чтобы указать результаты соответствующих совпадающих круглых скобок в шаблоне регулярного выражения.

  пусть re = / (\ w +) \ s (\ w +) /
let str = 'Джон Смит'
пусть newstr = str.replace (re, '$ 2, $ 1')
console.log (новая строка)
  

Здесь отображается «Смит, Джон» .

Использование регулярного выражения для разделения строк с разными окончаниями строк / окончаниями строк / переносами строк

Окончание строки по умолчанию зависит от платформы (Unix, Windows и т. Д.)]*день/);

Использование регулярного выражения с флагом залипания

Флаг залипания указывает, что регулярное выражение выполняет закрепленное сопоставление в целевой строке, пытаясь сопоставить, начиная с RegExp.prototype.lastIndex .

  let str = '# foo #'
пусть регулярное выражение = / foo / y

regex.lastIndex = 1
regex.test (str)
regex.lastIndex = 5
regex.test (str)
regex.lastIndex  

Разница между липким флагом и глобальным флагом

С липким флагом y следующее совпадение должно произойти в позиции lastIndex , а с глобальным флагом g совпадение может произойти в позиции lastIndex или позже:

  рэ = / \ д / у;
в то время как (r = re.exec ("123 456")) console.log (r, "И re.lastIndex", re.lastIndex);




  

С глобальным флагом g будут сопоставлены все 6 цифр, а не только 3.

Регулярное выражение и символы Unicode

\ w и \ W соответствуют только символам на основе ASCII; например, от до до z , от до Z , 0 от до 9 и _ .

Чтобы сопоставить символы из других языков, таких как кириллица или иврит, используйте \ u hhhh , где hhhh — это значение Unicode символа в шестнадцатеричном формате.

Этот пример демонстрирует, как можно отделить символы Юникода от слова.

  let text = 'Образец текста на русском языке'
пусть regex = / [\ u0400- \ u04FF] + / g

let match = regex.exec (текст)
console.log (совпадение [0])
console.log (regex.lastIndex)

пусть match3 = regex.exec (текст)
console.log (match3 [0])
console.log (regex.lastIndex)


  

Функция экранирования свойств Unicode предлагает решение, позволяя использовать такой простой оператор, как \ p {scx = Cyrl} ..] + /. exec (url) [0] .substr (7))

Вместо использования регулярных выражений для синтаксического анализа URL-адресов обычно лучше использовать встроенный в браузеры анализатор URL-адресов с помощью API URL-адресов.

BCD-таблицы загружаются только в браузер

Примечания для Firefox

Начиная с Firefox 34, в случае группы захвата с квантификаторами, препятствующими ее выполнению, согласованный текст для группы захвата теперь равен undefined вместо пустого строка:

 
'Икс'.replace (/ x (.)? / g, function (m, group) {
  console.log ("'группа:" + группа + "'");
});



'x'.replace (/ x (.)? / g, function (m, group) {
  console.log ("'группа:" + группа + "'");
});

  

Обратите внимание, что из-за веб-совместимости RegExp. $ N по-прежнему будет возвращать пустую строку вместо undefined (ошибка 1053944).

El ex-constructor está viviendo el ‘sueño americano’ con su restaurant Vikingos

Era un sueño de la infancia.

«Cuando yo era un niño, me gustaba mucho el marisco y quería abrir mi propio lugar de mariscos», дихо Карлос Ландерос, refiriéndose al deseo a largo plazo que tenía con apenas 8 nos cuando vivía en León, Guanajuxico en León.

Treinta y siete años más tarde y después de una carrera en la construcción, Ландерос, ахора-де-45 лет, está viviendo el sueño americano con su restaurant Vikingos en Bonita Springs, el que abrió hace cinco años. Después del éxito del Restaurante, Landeros —dueño y chef— ha ampiado recientemente el Restaurante de Bonita, abrió un segundo local en Immokalee y tiene interés en la apertura de un tercero.

Antes de que Landeros abriera Vikingos en Bonita Springs en julio de 2009, el ex trabajador de la construcción ya había estado vendiendo algunos de sus platos los fines de semana desde su casa a los compañeros de trabajo y amigos durante unos unos. Todos ellos le decían lo mismo: «Tienes que abrir tu propio Restaurante».

Le tomó 15 años ahorrar dinero, dijo Landeros, pero una vez que lo hizo, abrió su Restaurante de mariscos al estilo mexicano porque no veía ninguna otra oferta похожие пор лос алредедорес.

«En México, ‘mariscos’ (un plato de mariscos) se vende mucho, así que me dije a mí mismo que el marisco tiene que vender muy bien aquí», дихо.

Así Landeros, quien se mudó a los EE.UU. de México en 1988, se retiró de la industry de la construcción y se dedicó exclusivamente a ser un chef y a correr su restaurant.

Después haber estado abierto por alrededor de cinco años en su ubicación actual, Landeros registró un aumento en los clientes y decidió ampiarse.En Agosto, Vikingos Creció de 650 metros cuadrados и 1,300 пирогов cuadrados. Ресторан по адресу: 52 asientos, Está ubicado en Old 41 Road, en el centro de Bonita, en Nelson’s Plaza, al norte de la calle Terry, y cuenta con seis empleados — включая el sobrino y el cuñado de Landeros.

En una reciente visita, различные клиенты устанавливают disfrutando de su almuerzo mientras veían un partido de fútbol en uno de los cuatro televisores. Уильямс Чавес эра uno de ellos y dijo que la cocina tradicional mexicana es tan deliciosa que ha estado visitando a Vikingos desde que abrió.Чавес эс шеф-повар в ресторане Campiello.

«Me encanta», Дихо Чавес, де 40 ньос, Северный Неаполь. «Yo visito este lugar porque el marisco tiene un gran sabor y una buena combinación de especies».

Aunque no es extenso, el menú de Vikingos ofrece mucho para aquellas personas que buscan auténticos platillos de mariscos mexicanos. В меню включены cóctel de camarones o mariscos mixtos, ceviche y ostiones crudos en su concha, con aperitivo y platos con Precios que van desde $ 4.50 по 15 долларов.

El ceviche clásico mexicano — pescado fresco crudo curado en jugos de cítricos y especias — se sirve con tostadas o galletas. Эль севиче (13,50 долларов США) — это хечо, состоящее из кортадос в кубитосе, чеболла пикада, кинзы и чили халапеньо, сервидо кон мучо агуакате в верхней части. Los cócteles de mariscos frescos también vienen con varias rodajas de aguacate.

Pero si quiere hacer un plato un poco más picante, los comensales estuvieron de acuerdo, sin dudas, en salpicarlos con la propia salsa picante Landeros.

Cuando pregunté sobre qué componentsientes están en la salsa, Landeros sonrió y dijo que se trata de su «salsa especial», не обращая внимания на последнее сравнение.

Si los clientes tienen un poco de espacio a la izquierda después de la comida, Vikingos cuenta con Royal Scoop Homemade Ice Cream (helados hechos en casa) для удовлетворительных лос-антохос-де-дульс.

La expansión de agosto probablemente no será lo último para Vikingos.

En febrero, Landeros abrió su segundo restaurant Vikingos en Immokalee.Landeros dijo que también está interesado en abrir un tercer restaurant en el norte de Naples o en Golden Gate.

Хавьер Варгас, 35 лет, y su esposa, Арасели Гутьеррес, 36 лет, Бонита-Спрингс, dijeron que disfrutan de la comida en Vikingos tanto que cenan en el restaurant por lo menos una vez a la semana.

Vargas y Gutiérrez también son nativos de León como Landeros, y Vargas dijo que Landeros da su comida el «toque de México».

«Para mí, Vikingos es el único lugar donde puedo encontrar el sabor de León», дихо Варгас.

Pero no sólo los nativos mexicanos disfrutan de Vikingos. Vargas dijo que él ha traído amigos y compañeros de trabajo para probar la cocina del Restaurante.

Además de disfrutar de la buena comida, Gutiérrez dijo que disfrutan los platos a Precios razonables, un servicio amable y que está cerca de casa.

Los hijos de la pareja también disfrutan de comer en el restaurant семейный.

«Nos encanta», диджо элла. «Es uno de nuestros lugares Favoritos para venir a comer».

————-

Restaurante Vikingos No. 1 — 26880 Old 41 Road, Bonita Springs.

Abierto 10.00 — 20.00 de lunes a jueves y 10:00 — 21:00 de viernes a domingo. Teléfono: 239-992-1265

Restaurante Vikingos No. 2 — 901 Charlotte Street, Immokalee.

Abierto 10:00 — 21:00 de lunes a domingo y cerrado el martes. Teléfono: 239-867-4368

Практическое управление строительными рисками в сфере строительства — OEPASS

Информация о присуждении контракта

Полное наименование учреждения, выдавшего учетные данные :

Будапештский технологический и экономический университет — Институт непрерывного инженерного образования

Аккредитация учреждения :

Университет является государственным университетом, аккредитованным Венгерским комитетом по аккредитации ID: FI 23344
Институт непрерывного инженерного образования также сертифицирован по ISO 9001: 2015. номер аудита: EX 1449.18 (по www.ecomcert.org)

Веб-сайт / URL : http://www.mab.hu/web/index.php?option=com_content&view=article&id=214&Itemid=624&lang=hu

Информация об учетных данных

Официальное название аттестата : Практическое управление строительными рисками в строительной отрасли

Описание учетных данных :

Это 20-часовой дополнительный очный курс обучения по управлению рисками для инженеров в строительной отрасли.Заключительный экзамен — цифровой, 60% должны пройти сертификацию.

Тема : Менеджмент — Строительная промышленность

Тип учетных данных : Другое

Описание результатов обучения :

По окончании курса слушатель может:
— перечислять особенности рисков строительной отрасли;
— создать реестр рисков
— изучить точку зрения инвестора на риски;
— изучить точку зрения застройщика на риски;
— перечислить различные варианты страхования
— объяснить юридические аспекты риска в договоре

Способы получения учетных данных :

Подтверждение формального обучения

Схема оценок : сдать или не сдать экзамен. Порог более 60%

Режим (ы) обучения : онлайн, лицом к лицу, заочно

Продолжительность обучения : 20 часов

Метод (ы) оценки : Онлайн-оценка с проверкой личности

Предотвращение мошенничества с помощью :

Формат (ы) оценки : Автоматическая оценка

Что оценивается : Тест (отзыв)

Аккредитация удостоверений :

Национальная аккредитация университета
* Аккредитация института по ISO: EX 1449.18
Регистрация университета в качестве органа по обучению взрослых: E-000530/2014
Открытый значок

Домашняя страница учетных данных : http://moodle.mti.bme.hu/mod/simplecertificate/view.php?id=197&action=get

Дата публикации учетных данных : 14-03-2019

Сведения об обладателе (тестовом) удостоверении
  • Имя : Dénes Zarka
  • Дата рождения : 02-05-1965
  • Студенческий билет : нет

Удостоверение выдано держателю : 29-03-2019

Присуждено кредитов : 20

Дополнительные доказательства держателя удостоверений :

http: // moodle. mti.bme.hu/badges/badge.php?hash=1c83651311677e0b8ee50f38fe81adef049d3467

  Вернуться к списку общих учебных паспортов  

Словарь моделирования SPIN

Словарь моделирования SPIN

Аннотация

Словарь моделирования SPIN — это легкий набор Свойства и классы RDF для поддержки использования SPARQL для указать правила и логические ограничения. На основе RDF представление запросов SPARQL, SPIN определяет три класса описание свойства: spin: ограничение может использоваться для определения условий что все члены класса должны выполнять. spin: правило может использоваться для определения правил вывода с использованием SPARQL CONSTRUCT и DELETE / INSERT. spin: конструктор может использоваться для инициализации нового экземпляры со значениями по умолчанию. В дополнение к этим свойствам описания класса SPIN предоставляет мощные возможности мета-моделирования, которые можно использовать для построения собственный язык моделирования и расширения SPARQL. Эти функции мета-моделирования предоставляют возможность инкапсулировать многоразовые запросы SPARQL в шаблонов , и для получения новые функции SPARQL, а также магические свойства из других SPARQL запросы и функции.

Статус этого документа

SPIN изначально развивался как спецификация, разработанная TopQuadrant. По состоянию на февраль 2011 года SPIN был опубликован W3C в качестве заявки участников. TopQuadrant может продолжать улучшать SPIN в будущем и вносить изменения это будет опубликовано здесь. По состоянию на июль 2014 года эта версия практически идентична официальной версии W3C, за исключением того, что мы сняли требование использования синтаксиса SPIN RDF для определение запросов и команд обновления, если (и только если) sp: text троек присутствуют.Соответственно, мы изменили исходный код RDF некоторых примеры, чтобы их было легче читать. Еще одним изменением в июне 2013 года (с TopBraid 4.3) было добавление концепция (необязательных) метаданных столбца, прикрепленных к шаблонам SPIN. Версия от июля 2014 г. (с TopBraid 4.5) представила концепцию шаблоны union и встроенные функции SPARQL spin: ask, spin: construct и вращаемся: выбираем. Версия от августа 2014 г. добавила уровни нарушения ограничений. Версия от ноября 2014 года представила синтаксический сахар для ограничений ASK.


1 Введение

SPARQL теперь прочно утвердился в качестве стандартного языка запросов для RDF-модели и данные семантической сети. Многие RDF API и базы данных поставляются с поддержкой SPARQL прямо из коробки. В то же время SPARQL может быть рассматривается как больше, чем просто язык запросов с SELECT ключевое слово: SPARQL также предоставляет средства для проверки наличия определенных условий в настоящее время держится в модели RDF ( ASK ), чтобы получить новые троек из существующих троек ( CONSTRUCT ), и выполнить операции DELETE или INSERT . Хотя эти мощные элементы все чаще используются разработчиками для решать задачи приложений и моделирования, SPIN определяет систематический структура о том, как использовать запросы SPARQL для управления приложениями. SPIN продвигает SPARQL на шаг вперед и использует его для улучшения существующего RDF. модели с формальными, исполняемыми описаниями.

На основе синтаксиса SPIN SPARQL метод SPIN Словарь моделирования (описанный в этом документе) определяет легкое набор весов классов и свойств RDFS, которые можно использовать для систематически встраивать запросы SPARQL в модели RDF, чтобы они может выполняться с четко определенной семантикой.Основная идея использовать определенные свойства RDF для связывания классов с запросами SPARQL чтобы эти запросы SPARQL могли выполняться с заданным контекстом.

В следующих главах описывается, как этот подход можно использовать для описывать классы (и их экземпляры, Глава 2), и как построить больше сложные конструкции моделирования из повторно используемых запросов SPARQL (Глава 3). В главе 4 описаны рекомендации по использованию Словарь SPIN следует использовать в контексте семантической сети.

Обратите внимание, что примеры фрагментов RDF в этом документе в основном используют удобочитаемый нотация SPIN RDF с использованием свойства sp: text . Инструменты редактирования SPIN, такие как TopBraid, обычно генерируют тройки SPIN RDF, которые лучше подходят для машин, потому что они содержат правильные ссылки к ресурсам URI, не зависят от объявлений префиксов и т. д.

2 Описание класса Словарь

Словарь описания класса SPIN определяет несколько свойств RDF. которые можно использовать для присоединения запросов SPARQL к классам.Недвижимость spin: запрос является общим базовым свойством вращение: ограничение , вращение : правило и spin: конструктор . SPIN-совместимые инструменты могут использовать эти свойства для выполнения запросов SPARQL к экземплярам связанных класс (ы) в ответ на события. Например, спин: правило может использоваться механизмами рассуждений SPIN для построения предполагаемых троек RDF от текущей утвержденной информации в модели.

Запросы SPARQL, на которые ссылаются свойства SPIN, интерпретируются в контексте связанного класса. Во время выполнения переменная SPARQL - этот (по умолчанию) предварительно связан с экземплярами класса и его подклассы. Обычно сам запрос не требует привязки - это к любому значению в предложении WHERE . Контекст выполнения (например, механизм вывода) сделает это до запрос выполняется.Однако, если объект запроса имеет значение , истинно для свойства spin: thisUnbound , тогда система будет не делайте этого предварительного связывания. См. Отдельный раздел По подробностям про спина: thisUnbound .

SPIN использует объектно-ориентированный взгляд на мир моделей Семантической паутины, в котором запросы SPARQL играют аналогичную роль функциям и методам. Наследование (выраженное с использованием rdfs: subClassOf ) обрабатывается в том смысле, что любой запрос, определенный для суперклассов, также будет применяется к подклассам.Другими словами, дескрипторы класса SPIN могут только «сузить» и еще больше ограничить то, что было определено далее вверх по иерархии классов. В этом духе global class описания — это те, которые прикреплены к корневому классу rdfs: ресурс или его аналог в OWL owl: Thing . Эти глобальные запросы могут даже не упоминать - это вообще.

В следующих разделах представлена ​​подробная информация о трех классах SPIN. описание свойств.

2.1 Ограничения

Свойство spin: ограничение можно использовать для связывания rdfs: класс с SPARQL ASK или CONSTRUCT запросов. Каждый запрос ASK определяет ограничение, которое, как предполагается, оценивается как ложь для каждого экземпляра связанного класса (и его подклассы). Другими словами, если ограничение ASK оценивается как true для одного экземпляра, то экземпляр нарушает условие.При желании запросы CONSTRUCT могут создавать экземпляры spin: ConstraintViolation класс, который предоставляет подробную информацию по конкретному нарушению. Во время выполнения запроса переменная SPARQL ? This связана к текущему экземпляру класса.

Интерактивные инструменты, такие как формы редактирования, могут использовать ограничения для проверки ввода пользователя. Веб-службы могут проверять диапазоны параметров. Поскольку запросы SPIN напрямую привязаны к определениям классов в машиночитаемом формате предполагаемое «значение» и объем эти классы могут быть четко переданы другим агентам.xsd: строка; rdfs: subClassOf ex: Person; вращение: ограничение [SP: Спросите; sp: текст «» » # должно быть не моложе 18 лет СПРОСИТЕ ГДЕ { ? этот пример: возраст? возраст. ФИЛЬТР (? Возраст <18). } "" " ].

Нарушения ограничений могут быть связаны с дополнительной информацией. В следующем примере о нарушении будет сообщено как предупреждение. и указав на свойство ex: age в качестве причины.xsd: строка; rdfs: subClassOf ex: Person; вращение: ограничение [SP: Спросите; sp: текст «» » # должно быть не моложе 18 лет СПРОСИТЕ ГДЕ { ? этот пример: возраст? возраст. ФИЛЬТР (? Возраст <18). } "" "; spin: abusePath ex: age; спин: нарушение Уровень вращения: Предупреждение ].

2.1.2 Проверка ограничений с помощью CONSTRUCT

В следующем примере используется запрос SPARQL CONSTRUCT, который более сложный, чем стиль ASK, но гораздо более гибкий. Предполагается, что CONSTRUCT создает экземпляры системного класса spin: ConstraintViolation . Эти экземпляры обычно пустые узлы, и к ним можно прикрепить дополнительные свойства экземпляры нарушения, чтобы инструменты редактирования могли направлять ввод данных пользователем:

  • rdfs: этикетка может содержать текст, читаемый человеком что объясняет причину нарушения ограничения
  • spin: нарушениеRoot может ссылаться на ресурс это источник нарушения ограничения
  • spin: нарушение Путь может указывать на SPIN RDF выражение пути, которое часто является URI свойства
  • спин: нарушение Значение может указывать на конкретный узел RDF вызвавшее нарушение (вместе с нарушением Root и нарушениеPath может использоваться для указания на определенную тройку)
  • spin: нарушениеLevel может указывать на экземпляр spin: ConstraintViolationLevel , чтобы указать серьезность нарушения. Возможные значения см. В таблице ниже. По умолчанию вращение : Ошибка .
  • spin: fix может указывать на один или несколько Шаблоны SPIN, которые обертывают SPARQL Запрос на обновление. Подробности ниже.

Поддерживаемые значения spin: abuseLevel :

Уровень Описание
спин: информация Указывает, что нарушение не является проблемой.Может использоваться для диагностики и в целях отладки.
вращение: Предупреждение Проблема, которую, возможно, не нужно устранять, но она может привести к проблемам в будущем.
spin: Ошибка Ошибка, которую необходимо исправить. Это уровень по умолчанию.
спин: Fatal Серьезная ошибка, которую необходимо исправить. Механизмы проверки ограничений могут решить остановиться дальнейшая оценка после обнаружения фатальной ошибки.

В следующем примере конструируются нарушения ограничений всякий раз, когда супруг (а) человека имеет того же пола, что и текущий человек.

вращение: ограничение
          [SP: Construct;
            sp: текст "" "
                CONSTRUCT {
                    _: нарушение спин: ConstraintViolation;
                         spin: нарушениеRoot? this;
                         спин: нарушение Путь кеннеди: супруга;
                         spin: нарушениеValue? spouse;
                         спин: нарушениеУровень вращения: Предупреждение;
                         rdfs: метка "Однополые браки не разрешены (в этой модели)"
                }
                ГДЕ {
                    «этот кеннеди: супруга» супруга.«этот кеннеди: пол» пол.
                    супруга кеннеди: пол супруга
                    ФИЛЬТР (? Пол =? Пол супруга).
                } "" "
          ]. 

Ограничения SPIN могут использоваться для различных целей, но в в частности, чтобы убедиться, что экземпляр класса поддерживает свои ожидаемое состояние в отношении значений свойств и отношения с другими ресурсами. Например, простой SPIN ограничения могут проверять только диапазон некоторых литералов типа данных, но другие, более сложные ограничения также могут обходить соседние узлы, запуск сопоставления графа с образцом в контекстной переменной - это .Все, что можно выразить в SPARQL, можно использовать в ограничениях SPIN, включая запросы к другим конечным точкам SPARQL, пункты FILTER и сложные математические вычисления.

Обратите внимание, что значения вращения : ограничение свойство также может быть вызовом шаблона SPIN, предполагая, что эти шаблоны охватывают запросы CONSTRUCT или ASK. По сути, SPIN позволяет использовать шаблоны всякий раз, когда ожидается запрос, если тип запроса соответствует ожиданиям.

2.1.3 Нарушения ограничений, предлагающие исправления

Проверки ограничений формы CONSTRUCT также могут создавать дополнительная информация, которая может помочь пользователю исправить указанное ограничение нарушение. Вращение : ConstraintViolation может иметь одно или несколько значений. для вращения : исправить , указывая на вызов (экземпляр) spin: UpdateTemplate . Вызов шаблона обычно будет иметь дополнительные аргументы, которые также могут быть построены как часть ограничения проверьте предложение CONSTRUCT.

Следующий пример запроса прикреплен к классу Person с использованием spin: ограничение . Если Человек (? Это ) есть супруг (а) и моложе 18 лет, то нарушение будет сообщено. Спин : ConstraintViolation также указывает на шаблон SPIN типа : DeleteTriple , построенный как анонимный узел с идентификатором _: fix .

    CONSTRUCT {
        _: нарушение спин: ConstraintViolation;
                rdfs: метка «Несовершеннолетние браки не допускаются»;
                spin: нарушениеRoot? this;
                спин: нарушениеПуть: супруга;
                spin: fix _: fix. _: исправить: DeleteTriple;
                rdf: тема? это;
                rdf: сказуемое: супруга;
                rdf: объект? супруга.
    }
    ГДЕ {
        «это: супруга» супруга.
        ? это: возраст? возраст.
        ФИЛЬТР (? Возраст <18).
    } 

Не вдаваясь в подробности о шаблоне : DeleteTriple , это спин : UpdateTemplate , который обертывает SPARQL DELETE команда на указанную тройку. Шаблон принимает три аргумента, rdf: субъект , rdf: предикат и rdf: объект , которые заполняются CONSTRUCT выше с использованием текущих привязок переменных.Шаблон будет иметь понятную человеку этикетку, чтобы пользовательский интерфейс мог предложить исправление из контекстного меню.

2.2 Правила

Свойство spin: правило можно использовать для связывания rdfs: класс с запросами SPARQL CONSTRUCT или DELETE / INSERT операций обновления. Каждый запрос или операция определяет применяемое правило вывода. ко всем экземплярам связанного класса и его подклассов.

2.2.1 Правила вывода с использованием CONSTRUCT

Если свойство spin: правило указывает на запрос CONSTRUCT , затем это определяет правило вывода, которое определяет, как дополнительные тройки могут следует выводить из того, что указано в пункте WHERE . Для каждой привязки выкройки в ГДЕ пункт правила, тройные шаблоны из CONSTRUCT предложения создаются и добавляются как предполагаемые тройки к базовая модель.xsd: строка; rdfs: subClassOf сова: вещь; спин: правило [SP: Construct; sp: текст "" " CONSTRUCT { ? this ex: grandParent? grandParent. } ГДЕ { «родитель экс: ребенок» это. «grandParent ex: ребенок» родитель. } "" " ].

Свойство spin: правило имеет тип вращения : RuleProperty .Любое подсвойство спина : правило может использоваться в дополнение к spin: правило для хранения правил.

Вновь выведенные тройки правила CONSTRUCT войдут в специальный граф выводов. Этот график является частью графа запроса по умолчанию, который предложение WHERE будет выполняться, так что выводы из предыдущего шага будут видны «следующему» правилу.

2.2.2 Обновление правил с помощью DELETE / INSERT

Если свойство spin: rule указывает на операцию SPARQL UPDATE, то это определяет правило обновления, которое приведет к утверждениям, а не к выводам.Это потенциально более мощно, чем правила CONSTRUCT , потому что Правила UPDATE могут включать предложение DELETE ( DELETE WHERE также поддерживается), и, кроме того, появляется возможность указать цель графики, которые необходимо изменить. Еще одно преимущество использования правил UPDATE заключается в том, что никакой конкретный граф выводов не может потребуются, и, следовательно, выполнение правила может быть быстрее.

Однако обратите внимание, что ОБНОВЛЕНИЯ с помощью DELETE могут более легко привести к бесконечным циклам, потому что правила могут отменить результаты предыдущих шагов.Также обратите внимание, что изменения будут внесены в фактические модели, так что результат правила могут быть случайно сохранены при редактировании и оценке правил.

В следующем примере определяется правило, которое определяет значения ex: grandParent свойство из значений ex: child , и вставляет полученные тройки в указанный именованный граф.

    С 
    INSERT {
    ? this ex: grandParent? grandParent.}
    ГДЕ {
    «родитель экс: ребенок» это.
    «grandParent ex: ребенок» родитель. 
    } 
2.2.3 Контроль порядка исполнения правил

По умолчанию все правила могут выполняться в произвольном порядке. Однако словарь SPIN предоставляет некоторые свойства, которые можно использовать для управления механизмом исполнения. Дизайнеры могут использовать эти свойства для присоединения метаданных к правилам, помогите двигателю пропустить определенные правила. Это часто позволяет просто выполнить одну итерацию по всем правилам.

На самом детальном уровне правила можно сгруппировать по категориям. с использованием подсвойств вращения : правило . Недвижимость spin: nextRuleProperty можно использовать для связывания двух таких свойства вместе, так что правила из одной группы будут выполнены до другие. Например, если вы хотите запустить все ex: importRules перед всеми вращениями: правила , затем добавьте тройной пример: importRule spin: nextRuleProperty spin: rule и используйте ex: importRule , чтобы прикрепить правила с высоким приоритетом к вашему классу.

rdfs: комментарий правила следует использовать в качестве последнего уровня заказ. Это позволяет разработчикам вставлять комментарии такие как «# Step 1: …», «# Step 2: …» и т. д. в качестве первых строк их правила. Пользовательские интерфейсы могут использовать тот же порядок и (как TopBraid) может сделать это по умолчанию.

Свойство spin: rulePropertyMaxIterationCount можно прикрепить к любому подчиненному свойству spin: правило предписывает двигателю выполнять определенные правила определенное количество раз.В частности, это позволяет убедиться, что правила, создающие пустые узлы, выполняется один раз, что позволяет избежать проблем с бесконечными циклами.

2.2.4 Правила организации в библиотеках

В некоторых случаях правила могут быть импортированы из библиотеки. Такая библиотека файлы могут только объявлять сами правила, но не иметь дополнительных троек в них, что было бы актуально для выполнения правила. В базовый URI ( owl: Ontology ) таких файлов может быть аннотирован быть экземпляром вращения : LibraryOntology .В этом В этом случае все тройки из указанного графа должны игнорироваться SPIN движки правил.

2.2.5 Управление привязкой? This

В настройках по умолчанию правила SPIN или механизм проверки ограничений будут предварительно связать переменную - этот со всеми экземплярами связанных класс. Наивная реализация этого — добавить тройное совпадение, например - это rdf: введите ex: Class в предложение WHERE. Эта проверка будет убедитесь, что система выполняет итерацию только по значениям этого класса.xsd: boolean для указания двигателю чтобы обойти явную привязку - это . Вращение : thisUnbound свойство было введено в SPIN 1.1. Рекомендуем отображать движки должна отображать переменную ? это жирным шрифтом, чтобы указать, что она специальное значение, если не установлено spin: thisUnbound .

2.3 Конструкторы

Свойство spin: конструктор можно использовать для связывания rdfs: класс с запросами SPARQL CONSTRUCT или DELETE / INSERT операций обновления.Каждый запрос Construct определяет правило вывода, которое может быть применяется ко всем новым экземплярам связанного класса и его подклассы во время создания. Конструкторы обычно только оценивается один раз, чтобы установить начальные значения по умолчанию для некоторых свойств экземпляров. Во время выполнения запроса переменная SPARQL - этот привязан к текущему экземпляру класса.

Например, если пользователь создает новый экземпляр ex: USCitizen , то его конструктор можно использовать для автоматически установить его например: BirthCountry недвижимость до например: США .xsd: строка; rdfs: subClassOf ex: Person; spin: конструктор [SP: Construct; sp: текст «» » CONSTRUCT { ? это пример: BirthCountry ex: США. } ГДЕ { } «» » ].

Во время выполнения единственная тройка, которая будет надежно присутствовать для ? это — это rdf: введите тройной, связывает ? этот с классом, у которого есть конструктор прикрепленный к нему, или его подкласс.

SPIN-совместимые движки должны гарантировать, что суперкласс конструкторы выполняются перед конструкторами подклассов. Как следствие, конструкторы подклассов могут предполагать, что присутствуют дополнительные тройки, и могут запрашивать их в своих ГДЕ пунктов.

Конструкторы также должны выполняться механизмами вывода SPIN: Если правило создает новую тройку rdf: введите , тогда соответствующие конструкторы должны вызываться на предмет типа тройной.Конструкторы должны выполняться после правила был выполнен полностью — это гарантирует, что все тройки, упомянутые в шаблоне построения правила, будут создается и может быть запрошен предложением WHERE конструкторов.

Запросы SPARQL часто похожи и отличаются только одним или двумя значениями. SPIN можно использовать для обобщения запросов SPARQL, чтобы их можно было повторно используется в нескольких контекстах. Словарь мета-моделирования SPIN описанные в следующих разделах, представляют три механизма инкапсуляция шаблонов запросов SPARQL: шаблоны, Функции и магические свойства.

3.1 Шаблоны

Шаблоны представляют собой многоразовые «упакованные» запросы SPARQL, которые можно использовать в сочетании с такие свойства, как spin: rule или spin: constraint , но также в других местах.

В следующем примере определяется шаблон , например: MinCardinality . что можно использовать для проверки того, что ? этот имеет как минимум - подсчитать значений для данного свойства - предикат .xsd: строка; вращение: ограничение [spl: аргумент; rdfs: комментарий «минимальное количество ожидаемых значений»; spl: предикат ex: count; spl: valueType xsd: integer ]; вращение: ограничение [spl: аргумент; rdfs: комментарий «запрещенное свойство»; spl: предикат ex: предикат; spl: valueType rdf: Свойство ]; spin: labelTemplate «не менее {? count} значений для {? predicate}» ^^ xsd: string; вращение: тело [SP: Спросите; sp: текст «» » СПРОСИТЕ ГДЕ { ФИЛЬТР (например: количество элементов (? Предикат) } «» » ].

Шаблоны — это экземпляры подклассов метакласса spin: Template : спин: AskTemplate , спин: ConstructTemplate , spin: SelectTemplate и spin: UpdateTemplate , в зависимости от типа запроса, который они переносят. Эти метаклассы не следует путать с похожими по звучанию классами, такими как spin: AskTemplates , которые предназначены только для организации существующих шаблонов в категории, e.xsd: строка; rdfs: subClassOf сова: вещь; вращение: ограничение [пример: MinCardinality; пример: счет 1; пример: предикат ex: ребенок ].

Каждый аргумент шаблона должен быть представлен одним дескриптором аргумента (экземпляр шаблона spl: аргумент , где пространство имен для префикса spl это http://spinrdf.org/spl# ). Каждый дескриптор аргумента должен указывать на свойство RDF, используя spl: предикат .Это свойство будет содержать фактический шаблон значения при создании экземпляра шаблона. Локальное имя этого свойства используется как имя переменной для аргумента. Например, свойство sp: arg1 представляет переменную ? Arg1 . Аргументы также могут иметь тип значения с использованием spl: valueType и может быть spl: необязательно . Кроме того, аргументы могут определять значение по умолчанию, используя spl: defaultValue .Значение по умолчанию должно использоваться для аргумент, если значение не было явно указано в вызове шаблона. Настоятельно рекомендуется определить rdfs : комментарий для каждый аргумент, чтобы описать роль аргумента в запросе.

Сам инкапсулированный запрос должен быть сохранен с использованием spin: body . В зависимости от типа шаблона, spin: body должен быть экземпляром of sp: Ask , sp: Construct , sp: Describe или sp: выберите , sp: Modify или sp: DeleteWhere .

Во время выполнения запрос уже будет иметь переменные объявлены в дескрипторах аргументов, предварительно назначенных с аргументы в вызове шаблона.

Вызов шаблонов не может быть выполнен, если один или несколько необязательных аргументов не имеют ценностей. Единственное исключение — если класс шаблона (или любой из его суперклассов) имеет rdf: type spl: UnionTemplate , и в этом случае все аргументы необязательны.

Шаблоны должны определять значение для вращения : labelTemplate с заполнителями для имен переменных между {и}, чтобы Пользовательские интерфейсы могут отображать вызовы шаблонов в удобочитаемом виде. Например, приведенный выше вызов шаблона будет отображаться как

    не менее 1 значения для ex: child 

Шаблоны можно публиковать в семантической сети, а затем импортировать другими моделями. Агенты SPIN могут в принципе динамически разрешать шаблоны из Интернета, аналогичные распределенным веб-службам. Такие библиотеки шаблонов могут указывать предметно-ориентированные языки моделирования. (в качестве альтернативы или в дополнение к таким языкам, как OWL). поскольку шаблоны являются исполняемыми, эти основанные на шаблонах языки моделирования имеют четко определенную формальную семантику.

Когда шаблоны CONSTRUCT выполняются, например, как ограничения или правила SPIN, то движку SPIN необходимо также выполнять тела любого суперкласса этих шаблоны.

См. Также: Общие сведения о шаблонах SPIN

3.1.1 Метаданные столбца SPIN

Начиная с версии SPIN 1. 3.0 (опубликованной с TopBraid 4.3 в июне 2013 г.), словарь моделирования SPIN был расширен классами и свойствами, которые можно использовать для присоединения метаданных к табличные данные, особенно таблицы, созданные шаблонами SELECT.Вращение класса : TableDataProvider было введено в качестве одного суперкласса. из спинов: SelectTemplate . Каждое вращение : TableDataProvider (и, следовательно, Шаблон SELECT) может указывать на один или несколько экземпляров вращения : столбец через свойство спин: столбец . Экземпляры вращения : Столбец часто является пустыми узлами. Каждое вращение : Столбец может иметь следующие свойства (все, кроме spin: columnIndex не являются обязательными):

Имущество Диапазон Описание
rdfs: этикетка xsd: строка Отображаемая метка для заголовка таблицы.
spin: columnIndex xsd: целое число Индекс столбца слева направо, начиная с 0.
spin: columnType rdfs: класс Тип (данных) столбца. Например, столбцы xsd: float должны быть выровнены по правому краю.
spin: columnWidth xsd: целое число Ширина столбца в пикселях.

В следующем примере (в нотации Turtle) определяется шаблон SPIN для запроса SELECT, который возвращает имя и дату рождения каждого ребенка данного родителя.xsd: строка; spl: предикат arg: parent; spl: valueType schema: Person ]; вращение: тело [SP: Выбрать; sp: текст «» » ВЫБЕРИТЕ? ChildName? BirthDate ГДЕ { «дочерняя схема: родительская» родительская. ? дочерний rdfs: label? childName. НЕОБЯЗАТЕЛЬНЫЙ { Схема ребенка: BirthDate? BirthDate. }.xsd: строка.

Возможный рендеринг такой таблицы мог бы выглядеть следующим образом (здесь, используя swa: ResultSetGrid с веб-страниц SPARQL).

3.2 Функции

SPIN можно использовать для определения новых функций SPARQL, чтобы эти новая функция может использоваться в таких выражениях, как FILTER или BIND пунктов. Технически функции SPIN очень похожи на шаблоны SPIN.Функции определяются телом и нулем или более дескрипторов аргументов. Тело функции должно быть запросом Ask или запросом Select с ровно одна переменная результата.

В следующем примере объявляется новая функция ex: мощность который получает количество значений данного свойства в текущем субъект (? это ), используя SPARQL COUNT запрос.

    пример: мощность
      спин: Функция;
      rdfs: subClassOf spin: Functions;
      rdfs: comment "Получает количество значений данного свойства в текущей теме (? this).xsd: строка;
      вращение: ограничение
              [spl: аргумент;
                rdfs: comment "Свойство, мощность которого требуется получить." ;
                spl: предикат sp: arg1
              ];
      вращение: тело
              [SP: Выбрать;
                sp: текст "" "
                    ВЫБРАТЬ (СЧЁТ (? Объект) КАК? Результат)
                    ГДЕ {
                        «этот» объект «arg1».
                    } "" "
              ]. 

После определения функции ее можно использовать в запросах SPARQL, таких как

    ФИЛЬТР (пример: количество элементов (пример: ребенок)> 0) 

Выражение выше представлено в синтаксисе SPIN как

    [SP: Фильтр;
      sp: выражение
                 [sp: arg1 [sp: arg1: child;
                             пример: мощность
                           ];
                   sp: arg2 0;
                   a sp: gt
                 ]
    ] 

Аргументы объявляются так же, как и в случае с шаблонами (см. Выше).Основное отличие состоит в том, что аргументы функции должны быть упорядочены. так что традиционная текстовая нотация SPARQL может правильно округлить- их поездка. По умолчанию аргументы функции отсортированы по алфавиту. по их местному названию. Функции часто используют системные свойства sp: arg1 , sp: arg2 и т. Д., Чтобы объявить аргументы в ожидаемом порядке, но можно использовать и любое другое свойство. Вызов функций будет использовать объявленные значения по умолчанию для аргумента, если никакие другие значения явно не указаны.

Функции не должны иметь spin: body . В таких случаях предполагается, что среда выполнения предоставляет различные реализации из них, например как жестко запрограммированные функции Java или с использованием JavaScript (см. SPINx).

Классы функций (и шаблонов) могут быть помечены как абстрактные , установив свойство вращение: абстрактное истинное . Это указывает на окружающую среду что функция не должна создаваться напрямую, а только служит способом для организации и группировки других функций в иерархию.

Функции можно пометить как private , установив свойство spin: частные до true . Это сообщает окружающей среде, что функция должна использоваться только как «помощник» для других функций, но нигде больше.

См. Также: Общие сведения о функциях SPIN

3.2.1 Встроенная функция spin: eval

Совместимые со SPIN движки SPARQL должны обеспечивать встроенную функцию SPARQL. spin: eval , который можно использовать для оценки выражения SPIN или запрос во время выполнения.Это позволяет определить более высокий уровень функции, которые принимают вызовы других функций и запросы в качестве аргументов. Например, можно поместить выражение SPIN в качестве аргумента в шаблон. Затем тело шаблона может ссылаться на выражение (как предварительно связанная переменная) и оцените ее.

spin: eval принимает любое нечетное количество аргументов. Первый аргумент должен быть ссылкой на выражение SPIN (например, экземпляр функции SPARQL из пространства имен SP) или sp: выберите или sp: Ask .Остальные аргументы должны быть парами, так что первым будет свойство а второй — это значение, которое должно быть предварительно связано при оценке выражение.

В следующем примере выражение (привязанное к переменной? Выражение) выполняется с переменной ? arg3 , привязанной к буквальному значению. Результат функции будет присвоен - результату .

    BIND (spin: eval (? Выражение, sp: arg3, "значение") AS? Result) 

Если аргумент выражения — sp: выберите , тогда результат будет быть первой привязкой первой переменной результата. Если аргумент выражения — sp: Ask , то типизированный логический литерал будет возвращен.

3.2.2 Встроенная функция spin: ask

Совместимые со SPIN движки SPARQL должны обеспечивать встроенную функцию SPARQL. spin: спросите , который можно использовать для выполнения запроса SPIN ASK или соответствующий вызов шаблона во время выполнения. Это позволяет определять функции и механизмы выполнения более высокого уровня, которые принимают другие запросы в качестве аргументов.

Первый аргумент spin: ask должен быть ссылкой на sp: Ask или вызов шаблона, в котором содержится запрос ASK. Все последующие аргументы должны быть парами, первый из которых является именем переменной. а второй — его привязка. Эти привязки необходимо применять для выполнения запрос. Результат вращения : запрос является логическим. В следующем примере предполагается, что ? Запрос указывает на sp: Ask , а переменная ? это будет предварительно связано со значением owl: Thing :

    BIND (spin: ask (? Query, "this", owl: Thing) КАК? Результат) 

3.

3 магических свойства

Magic Properties (также известная как Property Functions ) поддерживается многими движками SPARQL. (например, Jena ARQ) для динамического вычисления значений во время запроса. Обычно магическое свойство поддерживается функцией вычисления, которая определяет привязки переменные в левой или правой части предиката.

SPIN позволяет пользователям определять такие магические свойства. Магические свойства объявлены очень похоже на SPIN Функции, но обеспечивают большую гибкость.В отличие от функций BIND / FILTER, магические свойства могут возвращать несколько ценности. Кроме того, любая входная или выходная переменная может быть несвязанной, и это задача магического свойства найти все потенциальные привязки этих переменных.

Метакласс spin: MagicProperty используется для представления магии. свойства. Как показано ниже, spin: MagicProperty является подклассом of spin: функция и rdf: свойство , что делает возможным использовать их как функции или как предикаты в тройном совпадении.

Давайте посмотрим на пример магического свойства grandParent , которое определяет дедушка и бабушка отношения между людьми. Это определяется как spin: MagicProperty с одним аргументом ? Arg1 из тип кеннеди: Человек . Вращение : тело магии недвижимость выглядит следующим образом:

    ВЫБРАТЬ? GrandParent
    ГДЕ {
        ? родитель кеннеди: ребенок? arg1.
        «grandParent kennedys: ребенок» родитель.xsd: строка;
                spl: предикат sp: arg1;
                spl: valueType kennedys: Person
              ];
      вращение: тело
              [SP: Выбрать;
                sp: текст "" "
                    ВЫБРАТЬ? GrandParent
                    ГДЕ {
                        ? родитель кеннеди: ребенок? arg1.
                        «grandParent kennedys: ребенок» родитель.
                    } "" "
              ]. 

Пример использования этой функции:

    ВЫБРАТЬ *
    ГДЕ {
        Кеннеди: Джон Кеннеди-младший: grandParent? grandParent. } 

Что возвращает привязки ? GrandParent с кеннеди: Джозеф Кеннеди и кеннеди: RoseFitzgerald . Во время выполнения обрабатывается предикат : grandParent . как вызов функции на основе запроса SPARQL, определенного как тело волшебное свойство. Значение в левой части магического свойства будет передан в функцию как ? arg1 . Результат привязки переменных в предложении SELECT будут привязаны к переменным в правая часть магического свойства.Имена входа и выхода переменные значения не имеют, учитывается только порядок появления.

Обратите внимание, что можно также использовать свойство типа : grandParent . как обычное имущество. Вопрос о том, будет создавать обычные тройки или выполнять вычисления динамически.

Магические свойства также могут принимать несколько аргументов и значений результата. используя (довольно неясный) синтаксис списка — эти случаи технически поддерживаются но сложно представить в синтаксисе SPIN RDF. По возможности сильно рекомендуется определять магические свойства только с одним аргументом и одной переменной результата. Это обеспечивает большую гибкость реализации и упрощает синтаксис и бремя реализации.

На этом фоне давайте рассмотрим другой вариант использования той же функции. сверху:

    ВЫБРАТЬ *
    ГДЕ {
        ? grandChild: grandParent kennedys: РоузФицджеральд.
    } 

Приведенный выше запрос связывает ? GrandChild со всеми внуками из кеннеди: RoseFitzgerald (всего несколько десятков, включая Кеннеди: Джон Кеннеди-младший ).Также можно оставить объект пуст, чтобы получить все отношения grandParent во всей модели.

Во время выполнения движок должен добавить аргументы к результату переменные тела (здесь: изменить подпись на ВЫБЕРИТЕ? GrandParent? Arg1 ). Затем предварительно привяжите все переменные которые были снабжены значениями и выполняют запрос SELECT. Используйте привязки результатов, чтобы ввести значения для несвязанных переменных.Если магическое свойство используется как тройное совпадение, то результат должен включить все существующие значения в график запроса в дополнение к привязки, производные от функции.

Начиная с spin: MagicProperty является подклассом spin: Function , любое магическое свойство также может использоваться как обычная функция ФИЛЬТР или ПОИСК. В этом случае будет только первая переменная результата первой строки результата. вернулся.

Обратите внимание, что функции SPIN и магические свойства могут использоваться для реализации поведение, известное как обратная цепочка на языках правил.Функции могут вызывать друг друга, даже рекурсивно, и механизм SPARQL будет перебирать несколько возможных пространств решений и выполнять обратное отслеживание если он не находит привязок для исходного запроса.

3.3.1 Встроенный спин Magic Property: construct

Совместимые со SPIN движки SPARQL должны обеспечивать встроенное волшебное свойство SPARQL. spin: построить , который можно использовать для выполнения запроса SPIN CONSTRUCT или соответствующий вызов шаблона во время выполнения.Это позволяет определять функции и механизмы выполнения более высокого уровня, которые принимают другие запросы в качестве аргументов.

Первый аргумент в левой части spin: конструкция должна быть ссылка на sp: Construct или вызов шаблона, в котором в качестве тела используется запрос CONSTRUCT. Все последующие аргументы должны быть парами, первый из которых является именем переменной. а второй — его привязка. Эти привязки необходимо применять для выполнения запрос.Правая часть магического свойства должна быть списком из трех записи. Обычно это несвязанные переменные, такие как (? S? P? O) , которые получит в качестве значений субъект, предикат и объект построенных троек. Если какие-либо из этих записей связаны, они будут интерпретированы как совпадение, что означает, что только те тройки, у которых действительно есть совпадающие субъект, предикат или объект, будут возвращается магическим свойством.

В следующем примере предполагается, что ? Запрос указывает на sp : Construct , а переменная ? это будет предварительно связано со значением owl: Thing .В результате выполнения переменные ? S , ? P и ? O . будут связаны с построенными тройками.

     (? запрос "this" owl: Thing) spin: construct (? s? p? o) 
3.3.2 Встроенное вращение Magic Property: выберите

Совместимые со SPIN движки SPARQL должны обеспечивать встроенное волшебное свойство SPARQL. spin: выберите , который можно использовать для выполнения запроса SPIN SELECT или соответствующий вызов шаблона во время выполнения. Это позволяет определять функции и механизмы выполнения более высокого уровня, которые принимают другие запросы в качестве аргументов.

Первый аргумент в левой части вращения : select должен быть ссылка на sp: выберите или вызов шаблона, который имеет запрос SELECT в качестве тела. Это также может быть запрос sp: Ask , и в этом случае он интерпретируется как запрос SELECT с ровно одной переменной результата и одной строкой. Все последующие аргументы должны быть парами, первый из которых является именем переменной. а второй — его привязка.Эти привязки необходимо применять для выполнения запрос. В правой части магического свойства должен быть список записей. которые соответствуют количеству переменных результата из запроса SPARQL. Обычно это несвязанные переменные, такие как (? A? B) , если SELECT доставляет две колонки. Если какие-либо из этих записей связаны, они будут интерпретированы как совпадение, что означает, что волшебным свойством будут возвращены только те строки, которые действительно имеют совпадающие значения.

В следующем примере предполагается, что ? Запрос указывает на sp : выберите , а переменная ? это будет предварительно связано со значением owl: Thing . В результате выполнения переменные ? A и ? B будет привязан к результирующим привязкам переменных.

     (? query "this" owl: Thing) spin: select (? a? b) 

4 библиотеки SPIN

SPIN — это язык моделирования, разработанный с помощью семантической сети. в уме.В этой главе описывается, как должны быть организованы документы SPIN. чтобы максимально использовать эту инфраструктуру.

4.1 SPIN и семантическая сеть

Ограничения, правила и конструкторы SPIN связаны с классами RDFS / OWL с использованием специальных свойств, таких как spin: constraint . На Семантическая сеть это означает, что когда класс RDFS доступен в сети, пользователи класса также получат связанную семантику таким же образом, как и они получать ярлыки, комментарии и т. д.Обычно определения и семантика классов хранится в том же документе.

Со словарем мета-моделирования SPIN ситуация немного иная, потому что функции и шаблоны SPIN можно использовать и в других местах. Однако функции и шаблоны SPIN имеют уникальный URI и поэтому могут быть загружены на какой-нибудь семантический веб-сайт, чтобы агенты, поддерживающие SPIN, могли найти исполняемое описание функции или шаблона по его URI. На практике это означает, что пользователи SPIN, планирующие поделиться своими файлами, должны убедитесь, что для выбранных URI есть возможность разыменования.Это просто означает, что если программный агент встречает функцию SPIN в запросе SPARQL, и эта функция изначально не известна двигателю, тогда двигатель может перейдите по ссылке на функцию, чтобы получить все тройки, необходимые для понимания того, как для его выполнения, включая spin: body .

Если файлы SPIN не используются в Семантической сети, а используются только локально, тогда это хорошая практика — помочь среде найти функцию и шаблон определения. Мы рекомендуем соглашение об именах для хранения таких файлов SPIN с окончание, такое как .spin.ttl или .spin.rdf . Это упрощает инструментам распознавание того, что файл может содержать SPIN. функции и шаблоны, чтобы инструмент мог заранее загрузить функции в память.

4.2 Импорт SPIN

Некоторые библиотеки ограничений или правил не зависят от конкретного домена онтологии, а скорее описывают общие закономерности. Например, можно для описания семантики подмножества OWL с использованием ограничений SPIN и, таким образом, повторно использовать словарь ограничений OWL для проверки ограничений целостности на существующие модели OWL.Такие библиотеки могут содержать spin: constraints которые просто прикреплены к owl: Thing или другому глобальному корневому классу.

Чтобы использовать такие библиотеки в контексте OWL, одним из вариантов является определение сова : импортирует , чтобы связать онтологию предметной области с ограничением библиотека. Однако это означает, что семантика OWL будет применяться к библиотеке. сам, потому что движки OWL будут объединять все тройки из файла SPIN и относиться к ним на том же уровне, что и к фактической тройке доменов.Более того, дополнительные тройки могут загромождать пользовательский интерфейс.

SPIN включает вращение : импортирует свойство , которое можно использовать связать базовый URI онтологии домена с файлом SPIN, заданным базовый URI файла SPIN. Для средства проверки ограничений SPIN (или механизма правил) ключевое слово spin: imports имеет то же значение, что и owl: import , т.е. все тройки из импортированного файла будут добавлены к текущему графику RDF. Однако тройки, указанные в spin: import , импортироваться не будут. в смысле OWL и поэтому остаются невидимыми для любого инструмента OWL.

В следующем примере онтология текущей предметной области (spinOWLTest) импортирует Библиотека ограничений SPIN, которая определяет подмножество OWL для проверки ограничений, чтобы движки SPIN сообщали о нарушении ограничения всякий раз, когда экземпляр из : Человек не имеет 1 : lastName . Обратите внимание, что это файл не импортирует пространство имен SPIN — он просто объявляет для него префикс.

    @prefix: .
    @prefix owl: .
    @prefix spin: .
    @prefix rdf: .
    @prefix rdfs: .
    @prefix xsd: .

    
      rdf: введите owl: Ontology;
      spin: импорт .xsd: int;
                сова: onProperty: lastName
              ]; ... 

Приложение: Ссылка

URL-адрес схемы SPIN: http://spinrdf.org/spin URL-адрес стандартной библиотеки модулей SPIN (SPL): http://spinrdf.org/spl

Экс-конструктор лифта стал хитом комедийной сети

Стендап-комик из Калгари Бриттани Лизенг в последнее время делает себе имя на национальной комедийной сети своим выступлением, наполненным забавными, непристойными анекдотами, в том числе из ее 12-летней строительной карьеры.

Лисенг, 33 года, из семьи ремесленников, включая дядей, которые были конструкторами лифтов, и поэтому для нее это казалось жизнеспособным и респектабельным образом жизни. За четыре года она заработала путевку подмастерья в Международном союзе строителей лифтов Local 130, а затем работала по всей провинции, в том числе в 60-этажном проекте Telus Sky в Калгари.

Но ей всегда нравилось быть смешной, и она часто думала о том, чтобы рискнуть в стендап, поэтому, когда пять лет назад ее отец перенес сердечный приступ, она подумала, что жизнь коротка, сейчас самое время рискнуть.Это была тяжелая работа и потребовалось терпение, но сегодня ее можно услышать на радиостанции CBC Laugh Out Loud и увидеть в сети LOL Кевина Харта, и она была на сцене на фестивале Just For Laughs в Монреале и JFL Northwest в Ванкувере, а также неоднократно выступала. на фестивале YYCOMEDY в ее родном городе в Калгари.

Естественно, дюжина лет строительства дает ей достаточно пищи для юмора. Ее анекдоты разыгрываются для смеха, но не нужно много времени, чтобы узнать, что Лисенг абсолютно любила свою работу и время, проводимое с коллегами.

«Я была первой женщиной в Альберте, которая выполнила эту работу, поэтому я была первой женщиной в этом союзе, так что у меня будет некоторый негативный опыт», — сказала Лисенг, которая недавно записала комедийный альбом на лейбле Vancouver’s 604 Records. «Но я не думаю, что кто-то пришел из плохого места. Они не привыкли к девушке на месте, они не знали, что сказать. Они не знали, достаточно ли я силен, чтобы перехватить другой конец. По их мнению, они думают, что это угроза безопасности.

«На стройке очень весело.Для того, что вы говорите, не так много правил. Так что вы можете говорить довольно забавные вещи, не попадая в затруднительное положение. Многие вещи, которые вылетали из моего рта, были хуже их ».

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

«Он говорит:« Вы уверены, что они кричат? »« Да, они кричат ​​на меня весь день ». И тогда я сообразил: я не думаю, что они кричат, им просто нужно то, что им нужно, быстрее, чем вам поняли.”

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

«Вы определенно должны постоять за себя. Если они пытаются задирать вас, подталкивать и заставлять вас идти, если вы просто понимаете, что вы намного умнее их и можете видеть сквозь мусор, тогда вы можете немного постоять за себя и сказать, почему », — сказала она. .

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

Она сравнивает связь, которая возникает между сидениями в комедийном клубе с другими комиксами, с духом товарищества, который она чувствовала на рабочих местах. Она сказала, что это похоже на строительную столовую.

«Когда вы строите гидравлический лифт, вы и еще один парень строите лифт, но когда вы находитесь в высотном здании, на месте может находиться 15 или 16 человек», — сказал Лисенг.«Мне всегда нравилась атмосфера, когда много ребят и ты очень хорошо проводишь время. Это довольно аккуратная и интересная работа, и я получил от нее массу удовольствия ».

M.3 — Конструкторы перемещения и назначение перемещения

В уроке M.1 — Введение в интеллектуальные указатели и семантику перемещения мы рассмотрели std :: auto_ptr, обсудили желание семантики перемещения и рассмотрели некоторые из недостатков, которые возникают, когда функции, разработанные для семантики копирования (конструкторы копирования и операторы присваивания копии), переопределяются для реализации семантики перемещения.

В этом уроке мы более подробно рассмотрим, как C ++ 11 решает эти проблемы с помощью конструкторов перемещения и присваивания перемещения.

Конструкторы копий и присвоение копий

Во-первых, давайте вспомним семантику копирования.

Конструкторы копирования используются для инициализации класса путем создания копии объекта того же класса. Назначение копирования используется для копирования одного класса в другой существующий класс. По умолчанию C ++ предоставляет конструктор копирования и оператор присваивания копии, если он не указан явно.Эти предоставляемые компилятором функции создают неглубокие копии, что может вызвать проблемы для классов, выделяющих динамическую память. Таким образом, классы, работающие с динамической памятью, должны переопределять эти функции для создания глубоких копий.

Возвращаясь к нашему примеру класса интеллектуального указателя Auto_ptr из первого урока этой главы, давайте рассмотрим версию, которая реализует конструктор копирования и оператор присваивания копии, выполняющие глубокие копии, и пример программы, которая их проверяет:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

51

52

53

54

55

56

57

58

59

60

61

62

63

9 0004 64

65

66

шаблон <класс T>

класс Auto_ptr3

{

T * m_ptr;

общедоступный:

Auto_ptr3 (T * ptr = nullptr)

: m_ptr (ptr)

{

}

~ Auto_ptr3 ()

{

удалить m_ptr;

}

// Конструктор копирования

// Сделайте глубокую копию файла. m_ptr в m_ptr

Auto_ptr3 (const Auto_ptr3 & a)

{

m_ptr = new T;

* m_ptr = * a.m_ptr;

}

// Копировать назначение

// Сделать глубокую копию a.m_ptr в m_ptr

Auto_ptr3 & operator = (const Auto_ptr3 & a)

{

// Обнаружение самоприсвоения

if (& a == this)

return * this;

// Освободить любой ресурс, который у нас есть

delete m_ptr;

// Копируем ресурс

m_ptr = new T;

* m_ptr = * а.m_ptr;

вернуть * это;

}

T & оператор * () const {return * m_ptr; }

T * оператор -> () const {return m_ptr; }

bool isNull () const {return m_ptr == nullptr; }

};

class Resource

{

public:

Resource () {std :: cout << "Ресурс получен \ n"; }

~ Resource () {std :: cout << "Ресурс уничтожен \ n"; }

};

Auto_ptr3 generateResource ()

{

Auto_ptr3 res (новый ресурс);

возврат res; // это возвращаемое значение вызовет конструктор копирования

}

int main ()

{

Auto_ptr3 mainres;

mainres = generateResource (); // это присваивание вызовет копирование

return 0;

}

В этой программе мы используем функцию с именем generateResource () для создания инкапсулированного ресурса с интеллектуальным указателем, который затем передается обратно в функцию main (). Затем функция main () назначает это существующему объекту Auto_ptr3.

Когда эта программа запускается, она печатает:

 Ресурс получен
Ресурс получен
Ресурс уничтожен
Ресурс получен
Ресурс уничтожен
Ресурс уничтожен
 

(Примечание: вы можете получить только 4 вывода, если ваш компилятор исключает возвращаемое значение из функции generateResource ())

Для такой простой программы происходит много создания и уничтожения ресурсов! Что тут происходит?

Рассмотрим подробнее.В этой программе выполняется 6 ключевых шагов (по одному для каждого напечатанного сообщения):

1) Внутри метода generateResource () создается локальная переменная res, которая инициализируется динамически выделяемым ресурсом, что приводит к первому «полученному ресурсу».
2) Res возвращается обратно в main () по значению. Здесь мы возвращаемся по значению, потому что res — это локальная переменная — она ​​не может быть возвращена по адресу или ссылке, потому что res будет уничтожена при завершении метода generateResource (). Таким образом, res — это копия, созданная во временный объект.Поскольку наш конструктор копирования выполняет глубокое копирование, здесь выделяется новый ресурс, что приводит к второму «полученному ресурсу».
3) Res выходит из области видимости, уничтожая первоначально созданный ресурс, что приводит к уничтожению первого ресурса.
4) Временный объект назначается mainres путем назначения копии. Поскольку наше назначение копии также выполняет глубокую копию, выделяется новый Ресурс, вызывая еще один «Ресурс приобретен».
5) Выражение присваивания завершается, временный объект выходит за пределы области действия выражения и уничтожается, вызывая «Ресурс уничтожен».
6) В конце main () mainres выходит за пределы области видимости, и отображается наш последний «Ресурс уничтожен».

Итак, короче говоря, поскольку мы вызываем конструктор копирования один раз, чтобы скопировать конструкцию res во временный объект, и один раз копируем присвоение, чтобы скопировать временное значение в mainres, в итоге мы выделяем и уничтожаем в общей сложности 3 отдельных объекта.

Неэффективно, но по крайней мере не дает сбоев!

Однако с семантикой перемещения мы можем добиться большего.

Переместить конструкторы и переместить назначение

C ++ 11 определяет две новые функции для обслуживания семантики перемещения: конструктор перемещения и оператор присваивания перемещения.В то время как цель конструктора копирования и присваивания копии — сделать копию одного объекта другому, цель конструктора перемещения и присваивания перемещения — переместить владение ресурсами с одного объекта на другой (что обычно намного дешевле, чем изготовление копии).

Определение конструктора перемещения и присваивания перемещения работают аналогично их копиям. Однако, в то время как разновидности копирования этих функций принимают ссылочный параметр const l-value, разновидности перемещения этих функций используют неконстантные ссылочные параметры r-значения.

Вот тот же класс Auto_ptr3, что и выше, с добавленным конструктором перемещения и оператором присваивания перемещения. Мы оставили конструктор копии с глубоким копированием и оператор присваивания копии для сравнения.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

51

52

53

54

55

56

57

58

59

60

61

62

63

9 0004 64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

0

80

78

79

81

82

83

84

85

86

87

88

89

90

91

92

93

94

#include

шаблон <класс T>

класс Auto_ptr4

{

T * m_ptr;

общедоступный:

Auto_ptr4 (T * ptr = nullptr)

: m_ptr (ptr)

{

}

~ Auto_ptr4 ()

{

удалить m_ptr;

}

// Конструктор копирования

// Сделайте глубокую копию файла. m_ptr в m_ptr

Auto_ptr4 (const Auto_ptr4 & a)

{

m_ptr = new T;

* m_ptr = * a.m_ptr;

}

// Переместить конструктор

// Передать право собственности на a.m_ptr на m_ptr

Auto_ptr4 (Auto_ptr4 && a) noexcept

: m_ptr (a.m_ptr)

{

a.m_ptr = null ; // мы подробнее поговорим об этой строке ниже

}

// Копировать присвоение

// Сделать глубокую копию файла.m_ptr to m_ptr

Auto_ptr4 & operator = (const Auto_ptr4 & a)

{

// Обнаружение самостоятельного назначения

if (& a == this)

return * this;

// Освободить любой ресурс, который у нас есть

delete m_ptr;

// Копируем ресурс

m_ptr = new T;

* m_ptr = * a.m_ptr;

вернуть * это;

}

// Перемещение уступки

// Передача права собственности на a.m_ptr to m_ptr

Auto_ptr4 & operator = (Auto_ptr4 && a) noexcept

{

// Обнаружение самостоятельного назначения

if (& a == this)

return * this;

// Освободить любой ресурс, который у нас есть

delete m_ptr;

// Передача права собственности на a. m_ptr на m_ptr

m_ptr = a.m_ptr;

a.m_ptr = nullptr; // подробнее об этой строке мы поговорим ниже

return * this;

}

T & оператор * () const {return * m_ptr; }

T * оператор -> () const {return m_ptr; }

bool isNull () const {return m_ptr == nullptr; }

};

class Resource

{

public:

Resource () {std :: cout << "Ресурс получен \ n"; }

~ Resource () {std :: cout << "Ресурс уничтожен \ n"; }

};

Auto_ptr4 generateResource ()

{

Auto_ptr4 res (новый ресурс);

возврат res; // это возвращаемое значение вызовет конструктор перемещения

}

int main ()

{

Auto_ptr4 mainres;

mainres = generateResource (); // это присвоение вызовет присвоение перемещения

return 0;

}

Конструктор перемещения и оператор присваивания перемещения просты. Вместо того чтобы глубоко копировать исходный объект (а) в неявный объект, мы просто перемещаем (крадем) ресурсы исходного объекта. Это включает в себя неглубокое копирование указателя источника в неявный объект с последующей установкой для указателя источника значения null.

При запуске эта программа печатает:

 Ресурс получен
Ресурс уничтожен
 

Это намного лучше!

Ход программы точно такой же, как и раньше. Однако вместо вызова конструктора копирования и операторов присваивания копии эта программа вызывает конструктор перемещения и операторы присваивания перемещения.Заглянем немного глубже:

1) Внутри метода generateResource () создается локальная переменная res, которая инициализируется динамически выделяемым ресурсом, что приводит к первому «полученному ресурсу».
2) Res возвращается обратно в main () по значению. Res перемещается во временный объект, передавая динамически созданный объект, хранящийся в res, во временный объект. О том, почему это происходит, мы поговорим ниже.
3) Рес выходит за рамки. Поскольку res больше не управляет указателем (он был перемещен во временный), здесь ничего интересного не происходит.
4) Временный объект перемещается в mainres. Это переносит динамически созданный объект, хранящийся во временном хранилище, в mainres.
5) Выражение присваивания завершается, а временный объект выходит за пределы области действия выражения и уничтожается. Однако, поскольку временный объект больше не управляет указателем (он был перемещен в mainres), здесь также не происходит ничего интересного.
6) В конце main () mainres выходит за пределы области видимости, и отображается наш последний «Ресурс уничтожен».

Таким образом, вместо того, чтобы копировать наш Ресурс дважды (один раз для конструктора копирования и один раз для назначения копии), мы передаем его дважды.Это более эффективно, так как ресурс создается и уничтожается только один раз, а не три раза.

Когда вызываются конструктор перемещения и присваивание перемещения?

Конструктор перемещения и присваивание перемещения вызываются, когда эти функции определены, а аргументом для построения или присваивания является r-значение. Чаще всего это r-значение будет буквальным или временным значением.

В большинстве случаев конструктор перемещения и оператор присваивания перемещения не будут предоставлены по умолчанию, если в классе нет определенных конструкторов копирования, присваивания копий, присваивания перемещения или деструкторов.Однако конструктор перемещения по умолчанию и назначение перемещения делают то же самое, что и конструктор копирования по умолчанию и назначение копирования (делают копии, а не перемещают).

Правило: если вам нужен конструктор перемещения и присваивание перемещений, выполняющее перемещения, вам нужно будет написать их самостоятельно.

Ключевое понимание семантики перемещения

Теперь у вас достаточно контекста для понимания ключевой идеи семантики перемещения.

Если мы конструируем объект или выполняем присваивание, где аргументом является l-значение, единственное, что мы можем разумно сделать, — это скопировать l-значение. Мы не можем предположить, что изменение l-значения безопасно, потому что оно может быть снова использовано позже в программе. Если у нас есть выражение «a = b», мы не можем ожидать каких-либо изменений b.

Однако, если мы конструируем объект или выполняем присваивание, в котором аргументом является r-значение, то мы знаем, что r-значение — всего лишь временный объект какого-то типа. Вместо того, чтобы копировать его (что может быть дорого), мы можем просто передать его ресурсы (что дешево) объекту, который мы создаем или назначаем.Это безопасно, потому что временное в любом случае будет уничтожено в конце выражения, поэтому мы знаем, что оно больше никогда не будет использоваться!

C ++ 11 через ссылки на r-значение дает нам возможность обеспечивать различное поведение, когда аргумент представляет собой r-значение по сравнению с l-значением, что позволяет нам принимать более разумные и эффективные решения о том, как должны вести себя наши объекты.

Функции перемещения должны всегда оставлять оба объекта в четко определенном состоянии

В приведенных выше примерах как конструктор перемещения, так и функции присваивания перемещения устанавливают. m_ptr в nullptr. Это может показаться лишним — в конце концов, если «a» — временное r-значение, зачем беспокоиться о выполнении «очистки», если параметр «a» все равно будет уничтожен?

Ответ прост: когда «a» выходит за пределы области видимости, вызывается деструктор a, и a.m_ptr удаляется. Если в этот момент a.m_ptr по-прежнему указывает на тот же объект, что и m_ptr, тогда m_ptr останется висящим указателем. Когда объект, содержащий m_ptr, в конечном итоге будет использован (или уничтожен), мы получим неопределенное поведение.

Кроме того, в следующем уроке мы увидим случаи, когда «а» может быть l-значением. В таком случае «a» не будет уничтожено немедленно, и его можно будет запросить еще до истечения срока его существования.

Автоматические l-значения, возвращаемые по значению, могут быть перемещены вместо копирования

В функции generateResource () приведенного выше примера Auto_ptr4, когда переменная res возвращается по значению, она перемещается, а не копируется, даже если res является l-значением. В спецификации C ++ есть специальное правило, согласно которому автоматические объекты, возвращаемые функцией по значению, могут быть перемещены, даже если они являются l-значениями.Это имеет смысл, поскольку res все равно будет уничтожен в конце функции! Мы могли бы также украсть его ресурсы, вместо того, чтобы делать дорогую и ненужную копию.

Несмотря на то, что компилятор может перемещать возвращаемые значения l-значения, в некоторых случаях он может добиться большего, просто полностью исключив копию (что позволяет избежать необходимости делать копию или вообще перемещать). В таком случае ни конструктор копирования, ни конструктор перемещения не будут вызываться.

Отключение копирования

В приведенном выше классе Auto_ptr4 мы оставили конструктор копирования и оператор присваивания для сравнения.Но в классах с поддержкой перемещения иногда желательно удалить конструктор копирования и функции присваивания копий, чтобы гарантировать, что копии не будут созданы. В случае с нашим классом Auto_ptr мы не хотим копировать наш шаблонный объект T — потому что это дорого, и какой бы класс T ни был, он может даже не поддерживать копирование!

Вот версия Auto_ptr, которая поддерживает семантику перемещения, но не семантику копирования:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33 34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

51

52

53

#include

шаблон <класс T>

класс Auto_ptr5

{

T * m_ptr;

общедоступный:

Auto_ptr5 (T * ptr = nullptr)

: m_ptr (ptr)

{

}

~ Auto_ptr5 ()

{

удалить m_ptr;

}

// Конструктор копирования — копирование запрещено!

Auto_ptr5 (const Auto_ptr5 & a) = удалить;

// Переместить конструктор

// Передать право собственности на a. m_ptr в m_ptr

Auto_ptr5 (Auto_ptr5 && a) noexcept

: m_ptr (a.m_ptr)

{

a.m_ptr = nullptr;

}

// Копирование назначения — копирование запрещено!

Auto_ptr5 & operator = (const Auto_ptr5 & a) = delete;

// Переместить назначение

// Передать право собственности на a.m_ptr на m_ptr

Auto_ptr5 & operator = (Auto_ptr5 && a) noexcept

{

// Обнаружение самостоятельного назначения

if (& a == this)

return * this;

// Освободить любой ресурс, который у нас есть

delete m_ptr;

// Передача права собственности на а.m_ptr в m_ptr

m_ptr = a.m_ptr;

a.m_ptr = nullptr;

вернуть * это;

}

T & оператор * () const {return * m_ptr; }

T * оператор -> () const {return m_ptr; }

bool isNull () const {return m_ptr == nullptr; }

};

Если бы вы попытались передать l-значение Auto_ptr5 функции по значению, компилятор пожаловался бы, что конструктор копирования, необходимый для инициализации аргумента конструктора копирования, был удален. Это хорошо, потому что мы, вероятно, все равно должны передавать Auto_ptr5 по ссылке const l-value!

Auto_ptr5 (наконец) хороший класс интеллектуальных указателей. Фактически, стандартная библиотека содержит класс, очень похожий на этот (который вы должны использовать вместо этого), с именем std :: unique_ptr. Подробнее о std :: unique_ptr мы поговорим позже в этой главе.

Другой пример

Давайте взглянем на другой класс, который использует динамическую память: простой динамический шаблонный массив.Этот класс содержит конструктор копии с глубоким копированием и оператор присваивания копии.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

51

#include

template

class DynamicArray

{

private:

T * m_array;

int m_length;

общедоступный:

DynamicArray (длина int)

: m_array (новый T [длина]), m_length (длина)

{

}

~ DynamicArray ()

{

delete [ ] m_array;

}

// Конструктор копирования

DynamicArray (const DynamicArray & arr)

: m_length (arr. m_length)

{

m_array = new T [m_length];

для (int i = 0; i

m_array [i] = arr.m_array [i];

}

// Копировать присвоение

DynamicArray & operator = (const DynamicArray & arr)

{

if (& arr == this)

return * this;

удалить [] m_array;

m_length = arr.m_length;

m_array = новый T [m_length];

для (int i = 0; i

m_array [i] = arr.m_array [я];

вернуть * это;

}

int getLength () const {return m_length; }

T & оператор [] (int index) {return m_array [index]; }

const T & оператор [] (int index) const {return m_array [index]; }

};

Теперь давайте используем этот класс в программе. Чтобы показать вам, как работает этот класс, когда мы выделяем миллион целых чисел в куче, мы собираемся использовать класс Timer, который мы разработали в уроке 11. 18 — Время вашего кода. Мы будем использовать класс Timer, чтобы измерить скорость выполнения нашего кода и показать разницу в производительности между копированием и перемещением.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33 34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

51

52

53

#include

#include // для функций std :: chrono

// Использует вышеуказанный класс DynamicArray

class Timer

{

private:

// Псевдонимы типов для упрощения доступа к вложенному типу

using clock_t = std :: chrono :: high_resolution_clock;

с использованием second_t = std :: chrono :: duration >;

std :: chrono :: time_point m_beg;

общедоступный:

Таймер (): m_beg (clock_t :: now ())

{

}

void reset ()

{

m_beg = clock_t :: now ();

}

double elapsed () const

{

return std :: chrono :: duration_cast (clock_t :: now () — m_beg). count ();

}

};

// Возвращаем копию arr со всеми удвоенными значениями

DynamicArray cloneArrayAndDouble (const DynamicArray & arr)

{

DynamicArray dbl (arr.getLength ());

для (int i = 0; i

dbl [i] = arr [i] * 2;

возврат дбл;

}

int main ()

{

Таймер t;

DynamicArray arr (1000000);

для (int i = 0; i

arr [i] = i;

arr = cloneArrayAndDouble (arr);

std :: cout << t.elapsed ();

}

На одной из машин автора в режиме релиза эта программа выполнилась за 0,00825559 секунды.

Теперь давайте снова запустим ту же программу, заменив конструктор копирования и присваивание копии конструктором перемещения и присваиванием перемещения.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

51

52

53

54

55

56

57

58

59

60

61

62

63

9 0004 64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

78

79

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

97

98

99

100

101

102

103

104

105

шаблон <класс T>

класс DynamicArray

{

частный:

T * m_array;

int m_length;

общедоступный:

DynamicArray (длина int)

: m_array (новый T [длина]), m_length (длина)

{

}

~ DynamicArray ()

{

delete [ ] m_array;

}

// Конструктор копирования

DynamicArray (const DynamicArray & arr) = delete;

// Копировать присвоение

DynamicArray & operator = (const DynamicArray & arr) = delete;

// Конструктор перемещения

DynamicArray (DynamicArray && arr) noexcept

: m_length (arr. m_length), m_array (arr.m_array)

{

arr.m_length = 0;

arr.m_array = nullptr;

}

// Перемещение присвоения

DynamicArray & operator = (DynamicArray && arr) noexcept

{

if (& arr == this)

return * this;

удалить [] m_array;

m_length = arr.m_length;

m_array = arr.m_array;

об.m_length = 0;

arr.m_array = nullptr;

вернуть * это;

}

int getLength () const {return m_length; }

T & оператор [] (int index) {return m_array [index]; }

const T & оператор [] (int index) const {return m_array [index]; }

};

#include

#include // для функций std :: chrono

class Timer

{

private:

// Псевдонимы типов для облегчения доступа к вложенному типу

с использованием clock_t = std :: chrono :: high_resolution_clock;

с использованием second_t = std :: chrono :: duration >;

std :: chrono :: time_point m_beg;

public:

Timer (): m_beg (clock_t :: now ())

{

}

void reset ()

{

m_beg = clock_t :: now ();

}

double elapsed () const

{

return std :: chrono :: duration_cast (clock_t :: now () — m_beg). count ();

}

};

// Возвращаем копию arr со всеми удвоенными значениями

DynamicArray cloneArrayAndDouble (const DynamicArray & arr)

{

DynamicArray dbl (arr.getLength ());

для (int i = 0; i

dbl [i] = arr [i] * 2;

возврат дбл;

}

int main ()

{

Таймер t;

DynamicArray arr (1000000);

для (int i = 0; i

arr [i] = i;

arr = cloneArrayAndDouble (arr);

std :: cout << t.elapsed ();

}

На том же компьютере эта программа была выполнена за 0,0056 секунды.

При сравнении времени выполнения двух программ 0,0056 / 0,00825559 = 67,8%. Версия с ходом была почти на 33% быстрее!


SPIN — Словарь моделирования

SPIN — Словарь моделирования

Аннотация

Словарь моделирования SPIN — это легкий набор Свойства и классы RDF для поддержки использования SPARQL для указать правила и логические ограничения. На основе RDF представление запросов SPARQL, SPIN определяет три класса описание свойства: spin: ограничение может использоваться для определения условий что все члены класса должны выполнять. spin: правило может использоваться для определения правил вывода с использованием SPARQL CONSTRUCT и DELETE / INSERT. spin: конструктор может использоваться для инициализации нового экземпляры со значениями по умолчанию. В дополнение к этим свойствам описания класса SPIN предоставляет мощные возможности мета-моделирования, которые можно использовать для построения собственный язык моделирования и расширения SPARQL.Эти функции мета-моделирования предоставляют возможность инкапсулировать многоразовые запросы SPARQL в шаблонов , и для получения новые функции SPARQL, а также магические свойства из других SPARQL запросы и функции.

Статус этого документа

В этом разделе описывается статус этого документа на момент его публикации. Другие документы могут заменять этот документ. Список текущих публикаций W3C может можно найти в указателе технических отчетов W3C по адресу http: // www.w3.org/TR/.

Этот документ является частью заявки SPIN, состоящей из трех документов:

  1. SPIN — Обзор и мотивация
  2. SPIN — Синтаксис SPARQL
  3. SPIN — Словарь моделирования

Более ранние версии спецификации SPIN были опубликованы неофициальным SPIN. рабочая группа http://spinrdf.org

Публикуя этот документ, W3C подтверждает, что Отправка участников сделали официальный запрос на отправку в W3C для обсуждения.Публикация этого документа W3C означает отсутствие поддержки его содержания W3C, ни то, что W3C имеет, не выделяет или не будет выделять какие-либо ресурсы для решения проблем, которыми он занимается. Этот документ не является продуктом зарегистрированной группы W3C, но опубликован как потенциальный вход в процесс W3C. Комментарий команды W3C был опубликовано вместе с этим представлением участников. Публикация признанного члена Публикации на сайте W3C — одно из преимуществ Членство в W3C. Ознакомьтесь с требованиями, связанными с представлениями участников Раздел 3.3 Патентной политики W3C. Пожалуйста, ознакомьтесь с полным список подтвержденных представлений членов W3C.


1 Введение

SPARQL теперь прочно утвердился в качестве стандартного языка запросов для RDF-модели и данные семантической сети. Многие RDF API и базы данных поставляются с поддержкой SPARQL прямо из коробки. В то же время SPARQL может быть рассматривается как больше, чем просто язык запросов с SELECT ключевое слово: SPARQL также предоставляет средства для проверки наличия определенных условий в настоящее время держится в модели RDF ( ASK ), чтобы получить новые троек из существующих троек ( CONSTRUCT ), и выполнить операции DELETE или INSERT .Хотя эти мощные элементы все чаще используются разработчиками для решать задачи приложений и моделирования, SPIN определяет систематический структура о том, как использовать запросы SPARQL для управления приложениями. SPIN продвигает SPARQL на шаг вперед и использует его для улучшения существующего RDF. модели с формальными, исполняемыми описаниями.

На основе синтаксиса SPIN SPARQL метод SPIN Словарь моделирования (описанный в этом документе) определяет легкое набор весов классов и свойств RDFS, которые можно использовать для систематически встраивать запросы SPARQL в модели RDF, чтобы они может выполняться с четко определенной семантикой.Основная идея использовать определенные свойства RDF для связывания классов с запросами SPARQL чтобы эти запросы SPARQL могли выполняться с заданным контекстом.

В следующих главах описывается, как этот подход можно использовать для описывать классы (и их экземпляры, Глава 2), и как построить больше сложные конструкции моделирования из повторно используемых запросов SPARQL (Глава 3). В главе 4 описаны рекомендации по использованию Словарь SPIN следует использовать в контексте семантической сети.

2 Описание класса Словарь

Словарь описания класса SPIN определяет несколько свойств RDF. которые можно использовать для присоединения запросов SPARQL к классам. Недвижимость spin: запрос является общим базовым свойством вращение: ограничение , вращение : правило и spin: конструктор . SPIN-совместимые инструменты могут использовать эти свойства для выполнения запросов SPARQL к экземплярам связанных класс (ы) в ответ на события.Например, спин: правило может использоваться механизмами рассуждений SPIN для построения предполагаемых троек RDF от текущей утвержденной информации в модели.

Запросы SPARQL, на которые ссылаются свойства SPIN, интерпретируются в контексте связанного класса. Во время выполнения переменная SPARQL - этот (по умолчанию) предварительно связан с экземплярами класса и его подклассы. Обычно сам запрос не требует привязки - это к любому значению в предложении WHERE .Контекст выполнения (например, механизм вывода) сделает это до запрос выполняется. Однако, если объект запроса имеет значение , истинно для свойства spin: thisUnbound , тогда система будет не делайте этого предварительного связывания. См. Отдельный раздел По подробностям про спина: thisUnbound .

SPIN использует объектно-ориентированный взгляд на мир моделей Семантической паутины, в котором запросы SPARQL играют аналогичную роль функциям и методам.Наследование (выраженное с использованием rdfs: subClassOf ) обрабатывается в том смысле, что любой запрос, определенный для суперклассов, также будет применяется к подклассам. Другими словами, дескрипторы класса SPIN могут только «сузить» и еще больше ограничить то, что было определено далее вверх по иерархии классов. В этом духе global class описания — это те, которые прикреплены к корневому классу rdfs: ресурс или его аналог в OWL owl: Thing .Эти глобальные запросы могут даже не упоминать - это вообще.

В следующих разделах представлена ​​подробная информация о трех классах SPIN. описание свойств.

2.1 Ограничения

Свойство spin: ограничение можно использовать для связывания rdfs: класс с SPARQL ASK или CONSTRUCT запросов. Каждый запрос ASK определяет ограничение, которое, как предполагается, оценивается как ложь для каждого экземпляра связанного класса (и его подклассы).Другими словами, если ограничение ASK оценивается как true для одного экземпляра, то экземпляр нарушает условие. При желании запросы CONSTRUCT могут создавать экземпляры spin: ConstraintViolation класс, который предоставляет подробную информацию по конкретному нарушению. Во время выполнения запроса переменная SPARQL ? This связана к текущему экземпляру класса.

Интерактивные инструменты, такие как формы редактирования, могут использовать ограничения для проверки ввода пользователя.Веб-службы могут проверять диапазоны параметров. Поскольку запросы SPIN напрямую привязаны к определениям классов в машиночитаемом формате предполагаемое «значение» и объем эти классы могут быть четко переданы другим агентам.

2.1.1 Проверка ограничений с использованием ASK

В следующем примере определяется ограничение для класса примера. например: Родительский , поэтому каждый экземпляр родительского элемента должен быть не моложе 18 лет от , например: лет.xsd: строка; sp: где ([sp: object sp: _age; sp: сказуемое ex: возраст; sp: тема вращения: _this ] [SP: Фильтр; sp: выражение [SP: LT; sp: arg1 sp: _age; sp: arg2 18 ] ]) ].

В текстовом синтаксисе SPARQL приведенный выше запрос будет выглядеть так:

    # должно быть не моложе 18 лет
    СПРОСИТЕ ГДЕ {
        ? этот пример: возраст? возраст.ФИЛЬТР (? Возраст <18).
    } 
2.1.2 Проверка ограничений с помощью CONSTRUCT

В следующем примере используется запрос SPARQL CONSTRUCT, который более сложный, чем стиль ASK, но гораздо более гибкий. Предполагается, что CONSTRUCT создает экземпляры системного класса spin: ConstraintViolation . Эти экземпляры обычно пустые узлы, и к ним можно прикрепить дополнительные свойства экземпляры нарушения, чтобы инструменты редактирования могли направлять ввод данных пользователем:

  • rdfs: этикетка может содержать текст, читаемый человеком что объясняет причину нарушения ограничения
  • spin: нарушениеRoot может ссылаться на ресурс это источник нарушения ограничения
  • spin: нарушение Путь может указывать на SPIN RDF выражение пути, которое часто является URI свойства
  • spin: fix может указывать на один или несколько Шаблоны SPIN, которые обертывают SPARQL Запрос на обновление. Подробности ниже.
вращение: ограничение
          [SP: Construct;
            sp: templates ([sp: object spin: ConstraintViolation;
                            sp: предикат rdf: type;
                            sp: subject _: b1
                          ] [sp: вращение объекта: _this;
                            sp: предикат спин: нарушениеRoot;
                            sp: subject _: b1
                          ] [sp: объект kennedys: супруга;
                            sp: вращение предиката: нарушениеPath;
                            sp: subject _: b1
                          ] [sp: object «Однополые браки не разрешены (в этой модели)»;
                            sp: предикат rdfs: label;
                            sp: subject _: b1
                          ]);
            sp: где ([sp: object sp: _spouse;
                            sp: сказуемое kennedys: супруга;
                            sp: тема вращения: _this
                          ] [sp: объект sp: _gender;
                            sp: предикат kennedys: пол;
                            sp: тема вращения: _this
                          ] [sp: объект sp: _spouseGender;
                            sp: предикат kennedys: пол;
                            sp: subject sp: _spouse
                          ] [SP: Фильтр;
                            sp: выражение
                                    [SP: EQ;
                                      sp: arg1 sp: _gender;
                                      sp: arg2 sp: _spouseGender
                                    ]
                          ])
              ] 

В текстовом синтаксисе SPARQL приведенный выше запрос будет выглядеть так:

    CONSTRUCT {
        _: b0 спин: ConstraintViolation;
             spin: нарушениеRoot? this;
             спин: нарушение Путь кеннеди: супруга;
             rdfs: метка "Однополые браки не разрешены (в этой модели)"
    }
    ГДЕ {
        «этот кеннеди: супруга» супруга. «этот кеннеди: пол» пол.
        супруга кеннеди: пол супруга
        ФИЛЬТР (? Пол =? Пол супруга).
    } 

Ограничения SPIN могут использоваться для различных целей, но в в частности, чтобы убедиться, что экземпляр класса поддерживает свои ожидаемое состояние в отношении значений свойств и отношения с другими ресурсами. Например, простой SPIN ограничения могут проверять только диапазон некоторых литералов типа данных, но другие, более сложные ограничения также могут обходить соседние узлы, запуск сопоставления графа с образцом в контекстной переменной - это .Все, что можно выразить в SPARQL, можно использовать в ограничениях SPIN, включая запросы к другим конечным точкам SPARQL, пункты FILTER и сложные математические вычисления.

Обратите внимание, что значения вращения : ограничение свойство также может быть вызовом шаблона SPIN, предполагая, что эти шаблоны охватывают запросы CONSTRUCT или ASK. По сути, SPIN позволяет использовать шаблоны всякий раз, когда ожидается запрос, если тип запроса соответствует ожиданиям.

2.1.3 Нарушения ограничений, предлагающие исправления

Проверки ограничений формы CONSTRUCT также могут создавать дополнительная информация, которая может помочь пользователю исправить указанное ограничение нарушение. Вращение : ConstraintViolation может иметь одно или несколько значений. для вращения : исправить , указывая на вызов (экземпляр) spin: UpdateTemplate . Вызов шаблона обычно будет иметь дополнительные аргументы, которые также могут быть построены как часть ограничения проверьте предложение CONSTRUCT.

Следующий пример запроса прикреплен к классу Person с использованием spin: ограничение . Если Человек (? Это ) есть супруг (а) и моложе 18 лет, то нарушение будет сообщено. Спин : ConstraintViolation также указывает на шаблон SPIN типа : DeleteTriple , построенный как анонимный узел с идентификатором _: fix .

    CONSTRUCT {
        _: нарушение спин: ConstraintViolation;
                rdfs: метка «Несовершеннолетние браки не допускаются»;
                spin: нарушениеRoot? this;
                спин: нарушениеПуть: супруга;
                spin: fix _: fix._: исправить: DeleteTriple;
                rdf: тема? это;
                rdf: сказуемое: супруга;
                rdf: объект? супруга.
    }
    ГДЕ {
        «это: супруга» супруга.
        ? это: возраст? возраст.
        ФИЛЬТР (? Возраст <18).
    } 

Не вдаваясь в подробности о шаблоне : DeleteTriple , это спин : UpdateTemplate , который обертывает SPARQL DELETE команда на указанную тройку. Шаблон принимает три аргумента, rdf: субъект , rdf: предикат и rdf: объект , которые заполняются CONSTRUCT выше с использованием текущих привязок переменных.Шаблон будет иметь понятную человеку этикетку, чтобы пользовательский интерфейс мог предложить исправление из контекстного меню.

2.2 Правила

Свойство spin: правило можно использовать для связывания rdfs: класс с запросами SPARQL CONSTRUCT или DELETE / INSERT операций обновления. Каждый запрос или операция определяет применяемое правило вывода. ко всем экземплярам связанного класса и его подклассов.

2.2.1 Правила вывода с использованием CONSTRUCT

Если свойство spin: правило указывает на запрос CONSTRUCT , затем это определяет правило вывода, которое определяет, как дополнительные тройки могут следует выводить из того, что указано в пункте WHERE . Для каждой привязки выкройки в ГДЕ пункт правила, тройные шаблоны из CONSTRUCT предложения создаются и добавляются как предполагаемые тройки к базовая модель.xsd: строка; rdfs: subClassOf сова: вещь; спин: правило [SP: Construct; sp: шаблоны ([sp: object sp: _grandParent; sp: предикат ex: grandParent; sp: тема вращения: _this ]); sp: где ([sp: вращение объекта: _this; sp: предикат ex: child; sp: subject sp: _parent ] [sp: объект sp: _parent; sp: предикат ex: child; sp: subject sp: _grandParent ]) ].

В текстовом синтаксисе SPARQL приведенный выше запрос будет выглядеть так:

    CONSTRUCT {
    ? this ex: grandParent? grandParent.
    }
    ГДЕ {
    «родитель экс: ребенок» это.
    «grandParent ex: ребенок» родитель.
    } 

Свойство spin: правило имеет тип вращения : RuleProperty . Любое подсвойство спина : правило может использоваться в дополнение к spin: правило для хранения правил.

Вновь выведенные тройки правила CONSTRUCT войдут в специальный граф выводов.Этот график является частью графа запроса по умолчанию, который предложение WHERE будет выполняться, так что выводы из предыдущего шага будут видны «следующему» правилу.

2.2.2 Обновление правил с помощью DELETE / INSERT

Если свойство spin: rule указывает на операцию SPARQL UPDATE, то это определяет правило обновления, которое приведет к утверждениям, а не к выводам. Это потенциально более мощно, чем правила CONSTRUCT , потому что Правила UPDATE могут включать предложение DELETE ( DELETE WHERE также поддерживается), и, кроме того, появляется возможность указать цель графики, которые необходимо изменить.Еще одно преимущество использования правил UPDATE заключается в том, что никакой конкретный граф выводов не может потребуются, и, следовательно, выполнение правила может быть быстрее.

Однако обратите внимание, что ОБНОВЛЕНИЯ с помощью DELETE могут более легко привести к бесконечным циклам, потому что правила могут отменить результаты предыдущих шагов. Также обратите внимание, что изменения будут внесены в фактические модели, так что результат правила могут быть случайно сохранены при редактировании и оценке правил.

В следующем примере определяется правило, которое определяет значения ex: grandParent свойство из значений ex: child , и вставляет полученные тройки в указанный именованный граф.

    С 
    INSERT {
    ? this ex: grandParent? grandParent.
    }
    ГДЕ {
    «родитель экс: ребенок» это.
    «grandParent ex: ребенок» родитель.
    } 
2.2.3 Контроль порядка исполнения правил

По умолчанию все правила могут выполняться в произвольном порядке. Однако словарь SPIN предоставляет некоторые свойства, которые можно использовать для управления механизмом исполнения. Дизайнеры могут использовать эти свойства для присоединения метаданных к правилам, помогите двигателю пропустить определенные правила.Это часто позволяет просто выполнить одну итерацию по всем правилам.

На самом детальном уровне правила можно сгруппировать по категориям. с использованием подсвойств вращения : правило . Недвижимость spin: nextRuleProperty можно использовать для связывания двух таких свойства вместе, так что правила из одной группы будут выполнены до другие. Например, если вы хотите запустить все ex: importRules перед всеми вращениями: правила , затем добавьте тройной пример: importRule spin: nextRuleProperty spin: rule и используйте ex: importRule , чтобы прикрепить правила с высоким приоритетом к вашему классу.

rdfs: комментарий правила следует использовать в качестве последнего уровня заказ. Это позволяет разработчикам вставлять комментарии такие как "# Step 1: ...", "# Step 2: ..." и т. д. в качестве первых строк их правила. Пользовательские интерфейсы могут использовать тот же порядок и (как TopBraid) может сделать это по умолчанию.

Свойство spin: rulePropertyMaxIterationCount можно прикрепить к любому подчиненному свойству spin: правило предписывает двигателю выполнять определенные правила определенное количество раз.В частности, это позволяет убедиться, что правила, создающие пустые узлы, выполняется один раз, что позволяет избежать проблем с бесконечными циклами.

2.2.4 Правила организации в библиотеках

В некоторых случаях правила могут быть импортированы из библиотеки. Такая библиотека файлы могут только объявлять сами правила, но не иметь дополнительных троек в них, что было бы актуально для выполнения правила. В базовый URI ( owl: Ontology ) таких файлов может быть аннотирован быть экземпляром вращения : LibraryOntology .В этом В этом случае все тройки из указанного графа должны игнорироваться SPIN движки правил.

2.2.5 Управление привязкой? This

В настройках по умолчанию правила SPIN или механизм проверки ограничений будут предварительно связать переменную - этот со всеми экземплярами связанных класс. Наивная реализация этого - добавить тройное совпадение, например - это rdf: введите ex: Class в предложение WHERE. Эта проверка будет убедитесь, что система выполняет итерацию только по значениям этого класса. xsd: boolean для указания двигателю чтобы обойти явную привязку - это . Вращение : thisUnbound свойство было введено в SPIN 1.1. Рекомендуем отображать движки должна отображать переменную ? это жирным шрифтом, чтобы указать, что она специальное значение, если не установлено spin: thisUnbound .

2.3 Конструкторы

Свойство spin: конструктор можно использовать для связывания rdfs: класс с запросами SPARQL CONSTRUCT или DELETE / INSERT операций обновления.Каждый запрос Construct определяет правило вывода, которое может быть применяется ко всем новым экземплярам связанного класса и его подклассы во время создания. Конструкторы обычно только оценивается один раз, чтобы установить начальные значения по умолчанию для некоторых свойств экземпляров. Во время выполнения запроса переменная SPARQL - этот привязан к текущему экземпляру класса.

Например, если пользователь создает новый экземпляр ex: USCitizen , то его конструктор можно использовать для автоматически установить его например: BirthCountry недвижимость до например: США .xsd: строка; rdfs: subClassOf ex: Person; spin: конструктор [SP: Construct; sp: шаблоны ([sp: object ex: USA; sp: предикат ex: BirthCountry; sp: тема вращения: _this ]); sp: где () ].

В текстовом синтаксисе SPARQL приведенный выше запрос будет выглядеть так:

    CONSTRUCT {
    ? это пример: BirthCountry ex: США.}
    ГДЕ {
    } 

Во время выполнения единственная тройка, которая будет надежно присутствовать для ? это — это rdf: введите тройной, связывает ? этот с классом, у которого есть конструктор прикрепленный к нему, или его подкласс.

SPIN-совместимые движки должны гарантировать, что суперкласс конструкторы выполняются перед конструкторами подклассов. Как следствие, конструкторы подклассов могут предполагать, что присутствуют дополнительные тройки, и могут запрашивать их в своих ГДЕ пунктов.

Конструкторы также должны выполняться механизмами вывода SPIN: Если правило создает новую тройку rdf: введите , тогда соответствующие конструкторы должны вызываться на предмет типа тройной. Конструкторы должны выполняться после правила был выполнен полностью — это гарантирует, что все тройки, упомянутые в шаблоне построения правила, будут создается и может быть запрошен предложением WHERE конструкторов.

Запросы SPARQL часто похожи и отличаются только одним или двумя значениями. SPIN можно использовать для обобщения запросов SPARQL, чтобы их можно было повторно используется в нескольких контекстах. Словарь мета-моделирования SPIN описанные в следующих разделах, представляют три механизма инкапсуляция шаблонов запросов SPARQL: шаблоны, Функции и магические свойства.

3.1 Шаблоны

Шаблоны представляют собой многоразовые «упакованные» запросы SPARQL, которые можно использовать в сочетании с такие свойства, как spin: rule или spin: constraint , но также в других местах.

В следующем примере определяется шаблон , например: MinCardinality . что можно использовать для проверки того, что ? этот имеет как минимум - подсчитать значений для данного свойства - предикат . Обратите внимание, что функция ex: cardinality является определяемой пользователем Функция SPIN, которая будет описана позже.

    пример: MinCardinality
      вращение: AskTemplate;
      rdfs: subClassOf spin: AskTemplates;
      rdfs: comment «Проверяет, есть ли у него хотя бы« счетные значения »для данного предиката свойства».  xsd: string;
      вращение: тело
              [SP: Спросите;
                sp: где ([sp: Filter;
                            sp: выражение
                                    [sp: arg1 [sp: arg1 sp: _predicate;
                                                пример: мощность
                                              ];
                                      sp: arg2 sp: _count;
                                      a sp: lt
                                    ]
                          ])
              ].

Вышеупомянутый основной запрос в синтаксисе SPARQL выглядит так:

    СПРОСИТЕ ГДЕ {
    ФИЛЬТР (например: количество элементов (? Предикат) 

Шаблоны - это экземпляры подклассов метакласса spin: Template : спин: AskTemplate , спин: ConstructTemplate , spin: SelectTemplate и spin: UpdateTemplate , в зависимости от типа запроса, который они переносят. Эти метаклассы не следует путать с похожими по звучанию классами, такими как spin: AskTemplates , которые предназначены только для организации существующих шаблонов в категории, e.xsd: строка; rdfs: subClassOf сова: вещь; вращение: ограничение [пример: MinCardinality; пример: счет 1; пример: предикат ex: ребенок ].

Каждый аргумент шаблона должен быть представлен одним дескриптором аргумента (экземпляр шаблона spl: аргумент , где пространство имен для префикса spl это http://spinrdf.org/spl# ). Каждый дескриптор аргумента должен указывать на свойство RDF, используя spl: предикат .Это свойство будет содержать фактический шаблон значения при создании экземпляра шаблона. Локальное имя этого свойства используется как имя переменной для аргумента. Например, свойство sp: arg1 представляет переменную ? Arg1 . Аргументы также могут иметь тип значения с использованием spl: valueType и может быть spl: необязательно . Кроме того, аргументы могут определять значение по умолчанию, используя spl: defaultValue .Значение по умолчанию должно использоваться для аргумент, если значение не было явно указано в вызове шаблона. Настоятельно рекомендуется определить rdfs : комментарий для каждый аргумент, чтобы описать роль аргумента в запросе.

Сам инкапсулированный запрос должен быть сохранен с использованием spin: body . В зависимости от типа шаблона, spin: body должен быть экземпляром of sp: Ask , sp: Construct , sp: Describe или sp: выберите , sp: Modify или sp: DeleteWhere .

Во время выполнения запрос уже будет иметь переменные объявлены в дескрипторах аргументов, предварительно назначенных с аргументы в вызове шаблона.

Шаблоны должны определять значение для вращения : labelTemplate с заполнителями для имен переменных между {и}, чтобы Пользовательские интерфейсы могут отображать вызовы шаблонов в удобочитаемом виде. Например, приведенный выше вызов шаблона будет отображаться как

    не менее 1 значения для ex: child 

Шаблоны можно публиковать в семантической сети, а затем импортировать другими моделями.Агенты SPIN могут в принципе динамически разрешать шаблоны из Интернета, аналогичные распределенным веб-службам. Такие библиотеки шаблонов могут указывать предметно-ориентированные языки моделирования. (в качестве альтернативы или в дополнение к таким языкам, как OWL). поскольку шаблоны являются исполняемыми, эти основанные на шаблонах языки моделирования имеют четко определенную формальную семантику.

См. Также: Общие сведения о шаблонах SPIN

3.

2 функции

SPIN можно использовать для определения новых функций SPARQL, чтобы эти новая функция может использоваться в таких выражениях, как FILTER или BIND пунктов. Технически функции SPIN очень похожи на шаблоны SPIN. Функции определяются телом и нулем или более дескрипторов аргументов. Тело функции должно быть запросом Ask или запросом Select с ровно одна переменная результата.

В следующем примере объявляется новая функция ex: мощность который получает количество значений данного свойства в текущем субъект (? это ), используя SPARQL COUNT запрос.xsd: строка; вращение: ограничение [spl: аргумент; rdfs: comment «Свойство, мощность которого требуется получить.» ; spl: предикат sp: arg1 ]; вращение: тело [SP: Выбрать; sp: resultVariables ([sp: Count; sp: выражение sp: _object ]); sp: где ([sp: object sp: _object; sp: предикат spin: _arg1; sp: тема вращения: _this ]) ].

После определения функции ее можно использовать в запросах SPARQL, таких как

    ФИЛЬТР (пример: количество элементов (пример: ребенок)> 0) 

Выражение выше представлено в синтаксисе SPIN как

    [SP: Фильтр;
      sp: выражение
                 [sp: arg1 [sp: arg1: child;
                             пример: мощность
                           ];
                   sp: arg2 0;
                   a sp: gt
                 ]
    ] 

Аргументы объявляются так же, как и в случае с шаблонами (см. Выше).Основное отличие состоит в том, что аргументы функции должны быть упорядочены. так что традиционная текстовая нотация SPARQL может правильно округлить- их поездка. По умолчанию аргументы функции отсортированы по алфавиту. по их местному названию. Функции часто используют системные свойства sp: arg1 , sp: arg2 и т. Д., Чтобы объявить аргументы в ожидаемом порядке, но можно использовать и любое другое свойство. Вызов функций будет использовать объявленные значения по умолчанию для аргумента, если никакие другие значения явно не указаны.

Функции не должны иметь spin: body . В таких случаях предполагается, что среда выполнения предоставляет различные реализации из них, например как жестко запрограммированные функции Java или с использованием JavaScript (см. SPINx).

Классы функций (и шаблонов) могут быть помечены как абстрактные , установив свойство вращение: абстрактное истинное . Это указывает на окружающую среду что функция не должна создаваться напрямую, а только служит способом для организации и группировки других функций в иерархию.

Функции можно пометить как private , установив свойство spin: частные до true . Это сообщает окружающей среде, что функция должна использоваться только как «помощник» для других функций, но нигде больше.

См. Также: Общие сведения о функциях SPIN

3.2.1 Встроенная функция spin: eval

Совместимые со SPIN движки SPARQL должны обеспечивать встроенную функцию SPARQL. spin: eval , который можно использовать для оценки выражения SPIN или запрос во время выполнения.Это позволяет определить более высокий уровень функции, которые принимают вызовы других функций и запросы в качестве аргументов. Например, можно поместить выражение SPIN в качестве аргумента в шаблон. Затем тело шаблона может ссылаться на выражение (как предварительно связанная переменная) и оцените ее.

spin: eval принимает любое нечетное количество аргументов. Первый аргумент должен быть ссылкой на выражение SPIN (например, экземпляр функции SPARQL из пространства имен SP) или sp: выберите или sp: Ask .Остальные аргументы должны быть парами, так что первым будет свойство а второй — это значение, которое должно быть предварительно связано при оценке выражение.

В следующем примере выражение (привязанное к переменной? Выражение) выполняется с переменной ? arg3 , привязанной к буквальному значению. Результат функции будет присвоен - результату .

    BIND (spin: eval (? Выражение, sp: arg3, "значение") AS? Result) 

Если аргумент выражения — sp: выберите , тогда результат будет быть первой привязкой первой переменной результата.Если аргумент выражения — sp: Ask , то типизированный логический литерал будет возвращен.

3.3 Магические свойства

Magic Properties поддерживается многими движками SPARQL (например, Jena ARQ) для динамического вычисления значений во время запроса. Обычно магическое свойство поддерживается функцией вычисления, которая определяет привязки переменные в левой или правой части предиката.

SPIN позволяет пользователям определять такие магические свойства. Магические свойства объявлены очень похоже на SPIN Функции, но обеспечивают большую гибкость. В отличие от функций LET / FILTER, магические свойства могут возвращать несколько ценности. Кроме того, любая входная или выходная переменная может быть несвязанной, и это задача магического свойства найти все потенциальные привязки этих переменных.

Метакласс spin: MagicProperty используется для представления магии. свойства. Как показано ниже, spin: MagicProperty является подклассом of spin: функция и rdf: свойство , что делает возможным использовать их как функции или как предикаты в тройном совпадении.

Давайте посмотрим на пример магического свойства grandParent , которое определяет дедушка и бабушка отношения между людьми. Это определяется как spin: MagicProperty с одним аргументом ? Arg1 из тип кеннеди: Человек . Вращение : тело магии недвижимость выглядит следующим образом:

    ВЫБРАТЬ? GrandParent
    ГДЕ {
        ? родитель кеннеди: ребенок? arg1. 
        «grandParent kennedys: ребенок» родитель.xsd: строка;
      rdfs: subClassOf spin: MagicProperties;
      вращение: тело
              [SP: Выбрать;
                sp: resultVariables (_: b2);
                sp: где ([sp: вращение объекта: _arg1;
                            sp: предикат kennedys: ребенок;
                            sp: subject _: b1
                          ] [sp: object _: b1;
                            sp: предикат kennedys: ребенок;
                            sp: subject _: b2
                          ])
              ];
      вращение: ограничение
              [spl: аргумент;
                rdfs: comment "Человек, которому нужно получить дедушку и бабушку.xsd: строка;
                spl: предикат sp: arg1;
                spl: valueType kennedys: Person
              ]. 

Пример использования этой функции:

    ВЫБРАТЬ *
    ГДЕ {
        Кеннеди: Джон Кеннеди-младший: grandParent? grandParent.
    } 

Что возвращает привязки ? GrandParent с кеннеди: Джозеф Кеннеди и кеннеди: RoseFitzgerald . Во время выполнения обрабатывается предикат : grandParent . как вызов функции на основе запроса SPARQL, определенного как тело волшебное свойство.Значение в левой части магического свойства будет передан в функцию как ? arg1 . Результат привязки переменных в предложении SELECT будут привязаны к переменным в правая часть магического свойства. Имена входа и выхода переменные значения не имеют, учитывается только порядок появления.

Обратите внимание, что можно также использовать свойство типа : grandParent . как обычное имущество. Вопрос о том, будет создавать обычные тройки или выполнять вычисления динамически.

Магические свойства также могут принимать несколько аргументов и значений результата. используя (довольно неясный) синтаксис списка — эти случаи технически поддерживаются но сложно представить в синтаксисе SPIN RDF. По возможности сильно рекомендуется определять магические свойства только с одним аргументом и одной переменной результата. Это обеспечивает большую гибкость реализации и упрощает синтаксис и бремя реализации.

На этом фоне давайте рассмотрим другой вариант использования той же функции. сверху:

    ВЫБРАТЬ *
    ГДЕ {
        ? grandChild: grandParent kennedys: РоузФицджеральд.} 

Приведенный выше запрос связывает ? GrandChild со всеми внуками из кеннеди: RoseFitzgerald (всего несколько десятков, включая Кеннеди: Джон Кеннеди-младший ). Также можно оставить объект пуст, чтобы получить все отношения grandParent во всей модели.

Во время выполнения движок должен добавить аргументы к результату переменные тела (здесь: изменить подпись на ВЫБЕРИТЕ? GrandParent? Arg1 ).Затем предварительно привяжите все переменные которые были снабжены значениями и выполняют запрос SELECT. Используйте привязки результатов, чтобы ввести значения для несвязанных переменных. Если магическое свойство используется как тройное совпадение, то результат должен включить все существующие значения в график запроса в дополнение к привязки, производные от функции.

Начиная с spin: MagicProperty является подклассом spin: Function , любое магическое свойство также может использоваться как обычная функция ФИЛЬТР или ПОИСК.В этом случае будет только первая переменная результата первой строки результата. вернулся.

Обратите внимание, что функции SPIN и магические свойства могут использоваться для реализации поведение, известное как обратная цепочка на языках правил. Функции могут вызывать друг друга, даже рекурсивно, и механизм SPARQL будет перебирать несколько возможных пространств решений и выполнять обратное отслеживание если он не находит привязок для исходного запроса.

4 библиотеки SPIN

SPIN — это язык моделирования, разработанный с помощью семантической сети. в уме. В этой главе описывается, как должны быть организованы документы SPIN. чтобы максимально использовать эту инфраструктуру.

4.1 SPIN и семантическая сеть

Ограничения, правила и конструкторы SPIN связаны с классами RDFS / OWL с использованием специальных свойств, таких как spin: constraint .На Семантическая сеть это означает, что когда класс RDFS доступен в сети, пользователи класса также получат связанную семантику таким же образом, как и они получить метки, комментарии и т. д. Обычно определения и семантика классов хранится в том же документе.

Со словарем мета-моделирования SPIN ситуация немного иная, потому что функции и шаблоны SPIN можно использовать и в других местах. Однако функции и шаблоны SPIN имеют уникальный URI и поэтому могут быть загружены на какой-нибудь семантический веб-сайт, чтобы агенты, поддерживающие SPIN, могли найти исполняемое описание функции или шаблона по его URI.На практике это означает, что пользователи SPIN, планирующие поделиться своими файлами, должны убедитесь, что для выбранных URI есть возможность разыменования. Это просто означает, что если программный агент встречает функцию SPIN в запросе SPARQL, и эта функция изначально не известна двигателю, тогда двигатель может перейдите по ссылке на функцию, чтобы получить все тройки, необходимые для понимания того, как для его выполнения, включая spin: body .

Если файлы SPIN не используются в Семантической сети, а используются только локально, тогда это хорошая практика — помочь среде найти функцию и шаблон определения.Мы рекомендуем соглашение об именах для хранения таких файлов SPIN с окончание, например .spin.ttl или .spin.rdf . Это упрощает инструментам распознавание того, что файл может содержать SPIN. функции и шаблоны, чтобы инструмент мог заранее загрузить функции в память.

4.2 Импорт SPIN

Некоторые библиотеки ограничений или правил не зависят от конкретного домена онтологии, а скорее описывают общие закономерности. Например, можно для описания семантики подмножества OWL с использованием ограничений SPIN и, таким образом, повторно использовать словарь ограничений OWL для проверки ограничений целостности на существующие модели OWL. Такие библиотеки могут содержать spin: constraints которые просто прикреплены к owl: Thing или другому глобальному корневому классу.

Чтобы использовать такие библиотеки в контексте OWL, одним из вариантов является определение сова : импортирует , чтобы связать онтологию предметной области с ограничением библиотека. Однако это означает, что семантика OWL будет применяться к библиотеке. сам, потому что движки OWL будут объединять все тройки из файла SPIN и относиться к ним на том же уровне, что и к фактической тройке доменов.Более того, дополнительные тройки могут загромождать пользовательский интерфейс.

SPIN включает вращение : импортирует свойство , которое можно использовать связать базовый URI онтологии домена с файлом SPIN, заданным базовый URI файла SPIN. Для средства проверки ограничений SPIN (или механизма правил) ключевое слово spin: imports имеет то же значение, что и owl: import , т. е. все тройки из импортированного файла будут добавлены к текущему графику RDF. Однако тройки, указанные в spin: import , импортироваться не будут. в смысле OWL и поэтому остаются невидимыми для любого инструмента OWL.

В следующем примере онтология текущей предметной области (spinOWLTest) импортирует Библиотека ограничений SPIN, которая определяет подмножество OWL для проверки ограничений, чтобы движки SPIN сообщали о нарушении ограничения всякий раз, когда экземпляр из : Человек не имеет 1 : lastName . Обратите внимание, что это файл не импортирует пространство имен SPIN — он просто объявляет для него префикс.

 @prefix: .
 @prefix owl: .
 @prefix spin: .
 @prefix rdf: .
 @prefix rdfs: .
 @prefix xsd: 

Leave a Reply