2014-01-13 3 views
1

Мы делаем программу для каталогизации изображений, присваивая им ключевые слова (теги).Как показать связанные (предлагаемые) ключевые слова?

Изображение содержит следующие ключевые слова "John", "Jane", "Portrait".

Другое изображение имеет следующие ключевые слова "John", "Jane", "Wedding".

Когда пользователь пытается каталогизировать следующее изображение и добавляет ключевое слово «Джон», мы хотим отобразить в области «Предлагаемые» ключевое слово «Джейн».

Как мы можем извлечь (используя SQL) предложенные ключевые слова на основе наиболее возможных комбинаций?

EDIT START:

в сторону «Джон» ждет ключевого слова, например «Джейн» выше, я думаю, что более теоретическая формулировка мы хотим ключевые слова в верхней «X», которые должны быть найдены вместе с то уже присвоенные «у» ключевых слов в присвоенных последних изображениях

: EDIT END

Обратите внимание, что изображения могут иметь несколько ключевых слов назначены и в «» РЕКОМЕНДУЕМУЮ области лучше иметь больше предложений.

Соответствующая таблица называется TagsTree и имеют следующее создание DDL:

CREATE TABLE TagsTree(ImageID INTEGER NOT NULL, TagID INTEGER NOT NULL, UNIQUE (ImageID, TagID)) 

... где ImageID является FK на фото объект и TagID является FK ссылкой на сущность ключевых слов.

Также приветствуются любые другие подсказки, касающиеся схемы и т. Д.

PS: Двигатель БД SQLite3, если это имеет значение.

+0

Просьба указать, что вы имеете в виду под «наиболее возможными комбинациями». –

ответ

1

Я думаю, что это может быть что-то вроде следующего. Например, мы найдем предложения для TagId=$SearchedTagID$. Сначала мы должны выбрать все TagID, которые имеют общий ImageId с $SearchedTagID$, а затем группу TagId и спуск сортировать результат по количеству вхождений каждого TagId. Также вы можете ограничить результаты некоторым значением (в этом примере 5 общих предложений (LIMIT 5)).

SELECT TagID, 
     COUNT(*) as CommonCount 
FROM TagsTree 
WHERE ImageID IN (SELECT ImageID FROM TagsTree WHERE TagID = $SearchedTagID$) 
     AND TagID <> $SearchedTagID$ 
GROUP BY TagID 
ORDER BY CommonCount DESC 
LIMIT 5 
Смежные вопросы