Если я вас правильно понимаю, вы хотите программно удалить неиспользуемые концепции из большой онтологии или коллекции онтологий / графов, а также удалить концепции / классы, которые вы определили как дубликаты, путем взаимосвязи.
Идентифицированные дубликаты легко удалить:
- Определите, что для вас является дубликатом.Например, узлы на любом конце ссылки owl: sameAs или skos: closeMatch находятся за пределами вашего основного графа (поэтому вы не удаляете «оригинал»).
Построение нового графика с использованием запроса SPARQL:
construct {?s ?p ?o.}
{
?s ?p ?o.
filter not exists {graph ?g {?s owl:sameAs ?x.} filter(?g!=<http://my.core.graph>)}
filter not exists {graph ?g {?o owl:sameAs ?x.} filter(?g!=<http://my.core.graph>)}
}
Я проверил этот запрос на синтаксис и производительность, но не на корректность.
Неиспользуемые понятия труднее удалить:
Во-первых, опять же, вам нужно определить, что означает для вас "неиспользованный".Однако этот критерий, безусловно, будет включать в себя достижимость или «связность» в объединенном графе, где вы хотите выбрать только компонент графа, который содержит вашу основную онтологию.Проблема заключается в том, что, если вы рассматриваете тройки как ненаправленные ребра, вы, вероятно, получите связанный граф (то есть только один компонент и не нужно удалять узлы), потому что иерархия типов часто связывает все.Вы могли бы принять во внимание направление ребер, то есть включить только ресурсы Y, где есть направленный путь от любого ресурса X в вашей основной онтологии до Y. Это обеспечит вам возможность подняться вверх по иерархии подклассов целевой онтологии до, например,Сова: Дело, но не снова.Проблема в том, что вы не знаете, какой другой тип ребер находится в целевой онтологии и в каком направлении они движутся, но вы можете пока использовать только rdfs: subClassOfdge.
Если вы достаточно определили свой "«Неиспользуемая концепция» или если вы хотите попробовать ее с каким-то экспериментальным определением, вы можете использовать библиотеку графов или приложение для анализа графов и импортировать туда свой код.
Вот пример того, как импортироватьконечная точка SPARQL в библиотеку визуализации графов JavaScript Cytoscape.js, она также может использоваться в узле.Однако вам нужно серьезно адаптировать код.
Или вы делаете это снова в SPARQL, используя пути к свойствам SPARQL 1.1.Проблема заключается в том, что они могут оказать значительное влияние на производительность (или даже сложность, которая слишком велика, чтобы когда-либо ее выполнять), особенно применительно к большому количеству ресурсов и неограниченной длине пути.Таким образом, вполне возможно, что запрос, подобный этому, истекает, но вы можете попробовать его адаптировать:
construct {?s ?p ?o.}
{
{?s ?p ?o.}
graph <http://my.core.graph> {?x rdfs:subClassOf ?X.}
{?x (<>|!<>)* ?s.}
}
Оператор ?x rdfs:subClassOf ?X
- это просто идентификатор, для которого вы хотите использовать ресурсы вашей основной онтологии.источник указывает, я не мог получить действительный запрос без этого.Когда я применяю оператор графа к выражению пути, я получаю синтаксическую ошибку от Virtuoso.