... существует проблема при преобразовании отношения «многие ко многим» из реляционной базы данных
Я бы сказал, что прямое отображение вводит дополнительную "паразитную" семантику, рассматривая артефакты нормализации как первоклассный объект.
Рассмотрим тестовый пример D011-M2MRelations .
Student
+---------+-----------+----------+
| ID (PK) | FirstName | LastName |
+---------+-----------+----------+
| 10 | Venus | Williams |
| 11 | Fernando | Alonso |
| 12 | David | Villa |
+---------+-----------+----------+
Student_Sport
+------------+----------+
| ID_Student | ID_Sport |
+------------+----------+
| 10 | 110 |
| 11 | 111 |
| 11 | 112 |
| 12 | 111 |
+------------+----------+
Sport
+---------+-------------+
| ID (PK) | Description |
+---------+-------------+
| 110 | Tennis |
| 111 | Football |
| 112 | Formula1 |
+---------+-------------+
Прямое отображение генерирует много троек такого рода:
<Student_Sport/ID_Student=11;ID_Sport=111> <Student_Sport#ref-ID_Student> <Student/ID=11>.
<Student_Sport/ID_Student=11;ID_Sport=111> <Student_Sport#ref-ID_Sport> <Sport/ID=111>.
<Student_Sport/ID_Student=11;ID_Sport=112> <Student_Sport#ref-ID_Student> <Student/ID=11>.
<Student_Sport/ID_Student=11;ID_Sport=112> <Student_Sport#ref-ID_Sport> <Sport/ID=112>.
Моделируя с нуля, вы, вероятно, напишите что-то вроде этого (R2RML позволяет добиться этого):
<http://example.com/student/11> <http://example.com/plays> <http://example.com/sport/111>.
<http://example.com/student/11> <http://example.com/plays> <http://example.com/sport/112>.
Более того, нельзя улучшить результаты, денормируя исходные таблицы или создавая представления SQL: без первичных ключей результаты, вероятно, будут даже хуже .
Чтобы улучшить результаты, последующие DELETE/INSERT
(или CONSTRUCT
) кажутся единственной доступной опцией. Процесс должен называться ELT, а не ETL. Возможно, следующие сгенерированные DM тройки были предназначены , чтобы помочь в таком преобразовании:
<Student_Sport/ID_Student=11;ID_Sport=111> <Student_Sport#ID_Student> "11"^^xsd:integer.
<Student_Sport/ID_Student=11;ID_Sport=111> <Student_Sport#ID_Sport> "111"^^xsd:integer.
<Student_Sport/ID_Student=11;ID_Sport=112> <Student_Sport#ID_Student> "11"^^xsd:integer.
<Student_Sport/ID_Student=11;ID_Sport=112> <Student_Sport#ID_Sport> "112"^^xsd:integer.
... говорят, что теряет семантику
@ JuanSequeda означает, что DM не генерирует онтологию OWL из реляционной схемы, это поведение не зависит от отношения «многие ко многим».
Смотрите также ссылки из Issue 14 .