Используя пример таблицы ниже, я хотел бы показать:визуализировать жанры фильмов
- а) узлы: что есть много фильмов, которые имеют «действие» или «драма», как жанр
- б) кромки (ненаправленный): когда фильм имеет «драма», как жанр, то есть, скорее всего, фильм также имеет жанр «действие»
Мой главный вопрос: как я могу лучше всего создать список всех ребер, состоящих из всех связанных жанров?
Скажем, у меня есть таблица с фильмами и жанров:
GENRE | MOVIE
--------------------------
Drama | A
Action | A
Comedy | A
Documentary | B
Romantic | B
Action | B
Drama | B
Drama | C
Romantic | C
Action | C
---------------------------
не имеют предпочтение рамках визуализации, но следующий приходит близко к то, что я имел в виду: http://visjs.org/examples/network/09_sizing.html
Другие предложения для визуализации более чем приветствуются!
Основываясь на моем примере фильма, узлы и ребра могли бы выглядеть следующим образом: http://jsfiddle.net/wivaku/90oef0pg/
В этом примере края жёстко. В реальной жизни я хотел бы создать их динамически. Как лучше всего создать ребра JSON, желательно используя PHP?
РНР фрагмент кода у меня есть на данный момент:
<?php
//the SQL rows (normally from SQL, now static):
$rows = json_decode('[["Drama","A"],["Action","A"],["Comedy","A"],["Documentary","B"],["Romantic","B"],["Action","B"],["Drama","B"],["Drama","C"],["Romantic","C"],["Action","C"]]');
$nodes = array();
$edges = array();
// create nodes
$genres = array_count_values(array_map(function($i) {return $i[0]; }, $rows));
foreach ($genres as $key => $value) {
$nodes[] = array("id"=>$key, "value"=>$value);
}
// create edges
// helpful to have genres grouped by movie? (normally from SQL, now static)
$movieGenres = json_decode('[{"movie":"A","genres":["Drama","Action","Comedy"]},{"movie":"B","genres":["Documentary","Romantic","Action","Drama"]},{"movie":"C","genres":["Drama","Romantic","Action"]}]');
// ...
print json_encode(["nodes"=>$nodes, "edges"=>$edges], JSON_NUMERIC_CHECK);
?>
Спасибо заранее!
Обновление: относительно комментариев о деталях/вариантах SQL. Стол, который у меня есть, в значительной степени указан в списке. Итак: genreId и contentId. Один из вариантов, который я изучал (как ярлык для кода PHP): объединить жанры в кино.
SELECT GROUP_CONCAT(genreId SEPARATOR "|") AS genres
FROM contentGenres
GROUP BY contentId
ORDER BY count(genreId) DESC
С примерных данными:
Drama|Action|Comedy
Documentary|Romantic|Action|Drama
Drama|Romantic|Action
Или используя жанр идентификаторы:
1|2|3
4|5|2|1
1|5|2
В результате моего реального набора данных ± 11000 строк, причем некоторые фильмы с 8 жанрами ,
является что реальная таблица?если это так, то это требует нормализации – Ejaz
Нет, это не настоящая таблица, просто пример. – wivku
@Wivku: вы хотите посчитать количество фильмов, в которых встречаются два жанра, чтобы получить «силу» между двумя жанрами? –