Вот (грубая) часть моделирования OWL, касающаяся шаблона для официального финансового законопроекта о бюджете министерств в моей стране. Он показывает класс заголовка бюджетного законопроекта как часть титульного листа такого документа (среди колофона, оглавления, подзаголовка и т. д.). Класс функционирует как образец для письменных бюджетных законопроектов правительства, в данном случае титульной части. Этот заголовок частично статичен (всегда содержит строку «Принятие бюджетного законопроекта министерства», что не представляет проблемы с использованием нотации owl: hasValue) и частично динамичен, в идеале получен от лиц из другого класса (название министерств ). Я не знаю, как это правильно смоделировать в OWL (если возможно). Я много гуглил и придумывал разные источники информации, намекающие на решение, но никогда не хватало для меня, чтобы действительно понять его и перевести в правильное рабочее решение.
:InitialBudgetBill-Title dct:identifier ftext:rbv1.10 .
:InitialBudgetBill-Title rdfs:label "Template Budget Bill".
:InitialBudgetBill-Title rdf:type owl:Class ;
owl:equivalentClass
[rdf:type owl:Class ;
owl:intersectionOf ( doco:Title
[rdf:type owl:Restriction ;
owl:onProperty c4o:hasContent;
owl:hasValue "Adoption of the Budget Bill of the Ministry of ????....?????"]
[rdf:type owl:Restriction ;
owl:onProperty dct:isPartOf;
owl:someValuesFrom :FrontMatter-InitialBudgetBill]
)
].
Вот код для структуры бюджета (министерства также называются разделами бюджета) и свойства с именами министерств, откуда я хотел бы извлечь имя и включить его в класс вышеупомянутого заголовка бюджетного законопроекта.
:BudgetChapter rdf:type owl:Class ;
rdfs:label "Budget Chapter"@en ;
rdfs:comment "A chapter within the national budget."@en ;
rdfs:subClassOf :BudgetStructureElements .
:hasBudgetChapterName rdf:type owl:DatatypeProperty ;
rdfs:label "has Budget Chapter Name"@en ;
vann:usageNote "A budget chapter has a name." ;
rdfs:comment "Indicates what name a budget chapter has."@en ;
rdfs:domain :BudgetChapter ;
rdfs:range xsd:string.
Физические лица:
:FinanceMinistry rdf:type :BudgetChapter.
:FinanceMinistry :hasBudgetChapterName "Ministry of Finance".
:BudgetBillTemplate2021_Title rdf:type :InitialBudgetBill-Title.
:BudgetBillTemplate2021_Title rdf:type doco:Title.
:BudgetBillTemplate2021_Title c4o:hasContent "Adoption of the Budget Bill of the Ministry of Finance".
:BudgetBillTemplate2021_Title dct:isPartOf :BudgetBillTemplate2021_FrontMatter.
:BudgetBillTemplate2021_FrontMatter rdf:type :FrontMatter-InitialBudgetBill.
:BudgetBillTemplate2021_FrontMatter rdf:type doco:FrontMatter.
Я бы хотел этого по нескольким причинам:
Мы также изучаем возможность включения в него SHACL (как для проверки, так и для генерации), но пока это не входит в мой вопрос.
Я прочитал следующие источники по теме:
Моделирование ограничений свойств типа данных OWL со списком значений
Строковые манипуляции в RDF / OWL
Как получить элементы выражения перечислимого типа данных OWL?
Я читал о создании типов данных, но, насколько мне известно, я не могу работать с пользовательскими типами данных, содержимое которых зависит от других лиц из других классов с другими свойствами. Я попытался придумать решение, используя (нерабочий) код (более или менее), как указано ниже, но я боюсь, что я полностью в неправильном направлении:
[rdf:type restriction;
owl:onProperty c4o:hasContent;
owl:someValuesFrom
[ rdf:type rdfs:Datatype ;
owl:onDatatype xsd:integer ;
owl:withRestrictions ([xsd:pattern "Adoption of the Budget Bill of the " && <some pattern using budget chapter names>"])
]
Я также рассмотрел использование свойства owl: oneOf, но и там я не могу динамически включать значения свойств отдельных лиц другого класса. Я мог бы сохранить в классе все названия различных разделов бюджета, но это не дает мне нужной динамики, и я не знаю, как комбинировать значения owl: oneOf со статической строкой «Принятие бюджетного счета». Затем у меня остается возможность смоделировать весь заголовок как значения свойства owl: oneOf, по одному для каждого отдела:
:InitialBudgetBill-Title dct:identifier ftext:rbv1.10 .
:InitialBudgetBill-Title rdfs:label "Template Budget Bill".
:InitialBudgetBill-Title rdf:type owl:Class ;
owl:equivalentClass
[rdf:type owl:Class ;
owl:intersectionOf ( doco:Title
[rdf:type owl:Restriction ;
owl:onProperty c4o:hasContent ;
owl:someValuesFrom [ rdf:type owl:Class ;
owl:oneOf ( "Adoption of the Budget Bill of the Ministry of Finance"
"Adoption of the Budget Bill of the Ministry of Economic Affairs"
"Adoption of the Budget Bill of the Ministry of Education")]
[rdf:type owl:Restriction ;
owl:onProperty dct:isPartOf;
owl:someValuesFrom :FrontMatter-InitialBudgetBill]
)
].
Я не уверен, что это надежное и правильное кодирование OWL.
Кроме того, поскольку названия министерств со временем меняются, было бы удобнее иметь проверенную модель данных / данные с актуальными названиями, с которыми я мог бы перекрестно проверять заголовки бюджетных документов. Следовательно, необходимость в большей динамике вместо жесткого кодирования названий министерств.
Я новичок в OWL, поэтому, к сожалению, ожидаю, что у меня будут некоторые ошибочные мысли в этой области. Я даже не работал с рассуждениями по этой модели, сначала я хочу понять, как правильно ее моделировать. Мне интересно, могут ли здесь быть полезны шаблоны разумных онтологий (OTTR, https://ottr.xyz/), но мне трудно понять и применить.
Может ли кто-нибудь мне помочь?
Интересно, @StanislavKralin, спасибо. Посмотрел w3.org/Submission/SWRL, но мне трудно понять, как объединить SWRL с OWL. Кажется, что это фреймворк внутри фреймворка, и это всегда сбивает меня с пути ;-) Был бы очень признателен, если бы кто-нибудь мог показать мне, как использовать swrlb: stringConcat () в модели OWL.
Дополнительный вопрос: как SWRL соотносится с SHACL? Вы бы сказали, что SHACL может делать то же, что и SWRL, и даже больше? Задавая это в связи с моим первоначальным вопросом, я хотел бы знать, какое решение будет наиболее надежным в будущем. Мы уже рассматриваем возможность применения SHACL, особенно для проверки согласованности, валидации и генерации данных. OWL по-прежнему будет использоваться, но для моделирования области знаний и повторного использования ее в запросах SPARQL (привнося больше контекста).





Может быть,
swrlb:stringConcat().