Поиск общего суперкласса и длины пути в иерархиях классов

У меня есть два класса, A и B, из DBpedia. Как я могу вычислить расстояние (число ребер) от каждого класса до общего суперкласса C, и как я могу найти этот общий суперкласс?

1 ответ

Вы можете сделать это, но сначала нужно отметить пару вещей:

  1. Два класса могут иметь много общих суперклассов, не обязательно только один. Это означает, что не может быть уникального наиболее специализированного общего суперкласса.
  2. Если некоторый класс C является суперклассом A и B, то каждый суперкласс C также является суперклассом A и B.
  3. Класс D может быть суперклассом C по нескольким путям, что может вызвать некоторые трудности, если вы пытаетесь вычислить длину. Например,

    Computer Hardware
      Monitors
        Flatscreen Monitors
          Dell Flatscreen Monitors  *
      Dell Hardware
        Dell Flatscreen Monitors    *
    

    В этой иерархии мониторы Dell Flatscreen Monitors являются подклассом компьютерного оборудования с длиной пути 2 (DFM → DH → CH) и длиной 3 (DFM → FM → M →CH). Это хорошо, но если вы вычисляете длину от DFM до другого подкласса CH, какой из них вы должны использовать?

  4. В данных не может быть общих суперклассов. Это также совершенно легальная ситуация. Теперь в OWL каждый класс является подклассом owl:Thing, но это не относится к RDF в целом, и вы, вероятно, даже не получите этот результат из DBpedia, потому что к нему не подключен аргумент OWL.

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

select ?sub ?super (count(?mid) as ?length) where {
  values ?sub { dbpedia-owl:Person } 
  ?sub rdfs:subClassOf* ?mid .
  ?mid rdfs:subClassOf+ ?super .
}
group by ?sub ?super

Результаты SPARQL

sub                                super                               length
http://dbpedia.org/ontology/Person http://dbpedia.org/ontology/Agent   1
http://dbpedia.org/ontology/Person http://www.w3.org/2002/07/owl#Thing 2

Теперь хитрость заключается в том, чтобы использовать этот подход для обоих подклассов, а затем объединить результаты на основе общих суперклассов, используя запрос, подобный следующему:

select * 
{
  values (?a ?b) { (dbpedia-owl:Person dbpedia-owl:SportsTeam) }

  { select ?a ?super (count(?mid) as ?aLength) { 
      ?a rdfs:subClassOf* ?mid .
      ?mid rdfs:subClassOf+ ?super .
    }
    group by ?a ?super
  }
  { select ?b ?super (count(?mid) as ?bLength) { 
      ?b rdfs:subClassOf* ?mid .
      ?mid rdfs:subClassOf+ ?super .
    }
    group by ?b ?super
  }
}

Результаты SPARQL

Этот запрос по-прежнему находит длины пути для всех распространенных суперклассов, а не только для самых конкретных, и он по-прежнему не добавляет длину из ?a в ?super и длина от ?b в ?super чтобы получить полную длину пути. Это просто немного арифметики. Вы можете упорядочить эти результаты по длине, а затем ограничить только одним результатом, чтобы получить самый короткий. Как я указывал, не может быть уникальных наиболее специфичных общих подклассов, но результат с наименьшей длиной будет одним из наиболее специфичных общих подклассов.

select ?a ?b ?super (?aLength + ?bLength as ?length)
{
  values (?a ?b) { (dbpedia-owl:Person dbpedia-owl:SportsTeam) }

  { select ?a ?super (count(?mid) as ?aLength) { 
      ?a rdfs:subClassOf* ?mid .
      ?mid rdfs:subClassOf+ ?super .
    }
    group by ?a ?super
  }
  { select ?b ?super (count(?mid) as ?bLength) { 
      ?b rdfs:subClassOf* ?mid .
      ?mid rdfs:subClassOf+ ?super .
    }
    group by ?b ?super
  }
}
order by ?length
limit 1

Результаты SPARQL

a      b          super length
Person SportsTeam Agent 3
Другие вопросы по тегам