2015-04-27 28 views
1

使用下面的示例表的風格,我想表明:想象電影

  • 一)節點:有是有「行動」或「戲劇」作爲一個流派
  • 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/

example of graph

在這個例子中,邊緣硬編碼。在現實生活中,我想動態創建它們。 如何最好地創建邊緣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個流派一些電影。

+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

的編號如您的示例流派的ID:

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

用於建議SQL級別而不是PHP的獎勵點數。 – wivku

+0

獎勵積分在哪裏?你甚至沒有提出答案:| – Ejaz

+0

mmm,獎勵分數是演講的形式。 :-0這些可以分發嗎?除了將答案標記爲已接受外,沒有意識到我應該注意。完成。 – wivku