Как я могу сохранить семантическую информацию в таблице MySQL? - PullRequest
1 голос
/ 31 октября 2010

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

Например, у меня есть статья об Apple и Microsoft.Семантические данные будут выглядеть как
Персона: Стив Джобс
Персона: Стив Баллмер
Компания: Apple
Компания: Microsoft

Я хочу сохранить информацию, не теряя информацию, которую СтивДжобс и Стив Баллмер - люди, а Apple и Microsoft - компании.Я также хочу найти статьи о Стиве Джобсе / Apple.

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

Обновление - это два варианта, которые я рассматриваю.

  1. Сохраните данные в полнотекстовом столбце как сериализованный массив php.
  2. Создайте еще одну таблицу с 3 столбцами

-

--------------------------------  
| id | subject | object        |
--------------------------------
|  1 | Person  | Steve Ballmer |
|  1 | Person  | Steve Jobs    |
|  1 | Company | Microsoft     |
|  1 | Company | Apple         |
|  2 | Person  | Obama         |
|  2 | Country | US            |
--------------------------------

Ответы [ 2 ]

2 голосов
/ 31 октября 2010

Возможно, вы захотите нормализовать таблицу данных, составив 2 таблицы.

----------------
| id | subject |
----------------
|  1 | Person  |  
|  2 | Company |
|  3 | Country |
----------------

-----------------------------------  
| id | subject-id | object        |
-----------------------------------
|  1 |          1 | Steve Ballmer |
|  2 |          1 | Steve Jobs    |
|  3 |          2 | Microsoft     |
|  4 |          2 | Apple         |
|  5 |          1 | Obama         |
|  6 |          3 | US            |
-----------------------------------

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

2 голосов
/ 31 октября 2010

Вы работаете над сложной и интересной проблемой!Вы можете получить некоторые интересные идеи, посмотрев Инициативу метаданных Дублинского ядра.

http://dublincore.org/metadata-basics/

Чтобы упростить процесс, представьте, что все элементы метаданных находятся в одной таблице.

например,

Ballmer employed-by Microsoft
Ballmer is-a Person
Microsoft is-a Organization
Microsoft run-by Ballmer
SoftImage acquired-by Microsoft
SoftImage is-a Organization
Joel Spolsky is-a Person
Joel Spolsky formerly-employed-by Microsoft
Spolsky, Joel dreamed-up StackOverflow
StackOverflow is-a Website
Socrates is-a Person
Socrates died-on (some date)

Хитрость в том, что некоторые, но не все, значения вашего первого и третьего столбца должны быть ОБА произвольным текстом И служить индексами для первого и третьего столбцов.Затем, если вы пытаетесь выяснить, что ваша база данных имеет в Spolsky, вы можете полнотекстовый поиск в первом и третьем столбцах его имени.Вы получите кучу тройняшек.Значения, которые вы найдете, скажут вам многое.Если вы хотите узнать больше, вы можете искать снова.

Чтобы выполнить это, вам, вероятно, понадобится пять столбцов, как показано ниже:

Full text subject  (whatever your user puts in)
Canonical subject (what your user puts in, massaged into a standard form)
Relation (is-a etc)
Full text object
Canonical object

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

SELECT * 
  FROM relationships a
  JOIN relationships b (ON a.canonical_object = b.canonical_subject)
 WHERE MATCH (subject,object) AGAINST ('Spolsky')
...