2015-04-27 2 views
1

Используя пример таблицы ниже, я хотел бы показать:визуализировать жанры фильмов

  • а) узлы: что есть много фильмов, которые имеют «действие» или «драма», как жанр
  • б) кромки (ненаправленный): когда фильм имеет «драма», как жанр, то есть, скорее всего, фильм также имеет жанр «действие»

Мой главный вопрос: как я могу лучше всего создать список всех ребер, состоящих из всех связанных жанров?

Скажем, у меня есть таблица с фильмами и жанров:

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/

example of graph

В этом примере края жёстко. В реальной жизни я хотел бы создать их динамически. Как лучше всего создать ребра 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 жанрами ,

+0

является что реальная таблица?если это так, то это требует нормализации – Ejaz

+0

Нет, это не настоящая таблица, просто пример. – wivku

+0

@Wivku: вы хотите посчитать количество фильмов, в которых встречаются два жанра, чтобы получить «силу» между двумя жанрами? –

ответ

3

Вы можете сделать обработку на уровне SQL, например, с помощью этого запроса:

SELECT a.genreId,b.genreId,count(*) 
FROM genres as a, genres as b 
WHERE a.contentId = b.contentId AND a.genreId < b.genreId 
GROUP BY a.genreId, b.genreId 

see an online demo here

идентификатору пронумерованы как жанры в вашем примере:

1 Drama 
2 Action 
3 Comedy 
4 Documentary 
5 Romantic 
+0

Бонусные баллы за предложение SQL-уровня вместо PHP. – wivku

+0

Где бонусные баллы? Вы даже не подтвердили ответ: | – Ejaz

+0

ммм, бонусные очки были фигурой речи. : -0 Может ли их раздавать? Не понял, что я должен продвигать в дополнение к обозначению ответа как принятого. Готово. – wivku

Смежные вопросы