使用下面的示例表的風格,我想表明:想象電影
- 一)節點:有是有「行動」或「戲劇」作爲一個流派
- b許多電影)邊(非定向):當一個電影有「戲劇」作爲一個流派,這是很有可能的電影也有類型爲「行動」
我的主要問題:我如何能夠最好地創建一個列表所有由所有連接類型組成的邊緣?
比方說,我有一個電影和類型的表:
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代碼片段我都不得不時刻:
<?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
或使用該類型的ID:
1|2|3
4|5|2|1
1|5|2
我的真實數據集的結果是±11000行,其中有8個流派一些電影。
是那是一張真正的桌子?如果是的話,那麼它需要正常化 – Ejaz
不,它不是一個真正的表,只是一個例子。 – wivku
@Wivku:所以你想要計算兩種流派出現的電影數量,以獲得兩種流派之間的「力量」? –