2013-06-02 10 views
1

내 목표는 용어의 지식 그래프를 작성하는 것입니다. 각 학기마다; 나는 (어쨌든 쉽게) 그 용어에서 다른 모든 용어로 즉시 연결을 추출 할 수있다. (MySQL을 내에 저장 될 수있다) 다음의 테이블 I은 추출 할 수 있는지의 예이다 : 상기 테이블의 각 행지식 그래프 데이터 구조 간의 연결 추출

enter image description here

; 즉각적인 (UNDIRECTED) 연결과 그 무게 (또는 강도)를 봅니다. 모든 연결은 방향이 지정되지 않습니다.

그래서 질문은; 우리는 간접적 인 인 기간 사이 연결을 알아낼 수 있습니까? 예를 들어; Leonardo Da VinciMichelangelo 사이의 하나의 링크는 Italy이라는 용어를 사용합니다. 로 표현 될 수있는 :

Leonardo Da Vinci -- 4 (weight) -- Italy -- 6 (weight) -- Michelangelo

는 PHP와 MySQL을 사용하여, 우리는 간단하게 다음을 수행 할 수 있습니다;

<? include('db_settings.php'); ?> 

<?php 

    $con = mysqli_connect($myDB_server, $myDB_userName, $myDB_password, $myDB_name); 

    if (mysqli_connect_errno($con)) 
     echo "Error :(<BR/>"; 

    $connectionFrom = 'Leonardo Da Vinci'; 

    $result = mysqli_query($con, "SELECT * FROM termLinks WHERE termLinks_t1 = '$connectionFrom'"); 

    while($row = mysqli_fetch_array($result)) 
    { 
     $currConnection = $row[2]; 
     $newResult = mysqli_query($con, "SELECT * FROM termLinks WHERE termLinks_t2 = '$currConnection'"); 

     while ($newRow = mysqli_fetch_array($newResult)) 
     { 
      if (strcmp($newRow[1], $connectionFrom) != 0) 
       echo "There is a connection between " . $connectionFrom . " and " . $newRow[1] . " through " . $currConnection; 
     } 

     echo "<BR/>"; 
    } 

    mysqli_close($con); 
?> 

다음에 발생합니다 어떤 : There is a connection between Leonardo Da Vinci and Michelangelo through Italy There is a connection between Leonardo Da Vinci and Lorenzo de’ Medici through Renaissance

그러나 다른 상황에서

; 연결을 찾으려면 여러 링크를 통과해야 할 수도 있습니다.

Lorenzo de’ Medici -- Renaissance -- Leonardo Da Vinci -- Italy -- Michelangelo

것은 무엇 모든 용어 사이의 모든 연결을 추출하는 가장 좋은 방법이 될 것입니다 : 예를 들어 다음을 통해 Lorenzo de’ MediciMichelangelo 사이의 연결이 존재 하는가? 나는 이것이 해결되어야 할 매우 복잡한 문제 일 수 있음을 이해한다; 그러나 나는 모든 연결을 다소 효율적으로 추출하는 데 사용할 수있는 데이터 구조를 만들 수있는 제안을하고 있습니다 ...

+1

[일시적 폐쇄] (http://en.wikipedia.org/wiki/Transitive_closure) 및 [이 답변들] (http://stackoverflow.com/questions/3517524/best-known-transitive-closure)을 확인하십시오. 그래프 용 알고리즘) –

답변

1

mysql의 GROUP_CONCAT을 사용하면 termLinks_t2가 공통으로있는 모든 termLinks_t1을 그룹화합니다

SELECT 
    a.*, 
    (SELECT 
     GROUP_CONCAT(b.termLinks_t1) 
     FROM 
      termLinks b 
     WHERE 
      a.termLinks_t2 = b.termLinks_t2 AND 
      a.termLinks_t1 != b.termLinks_t1 
     GROUP BY 
      b.termLinks_t1 
     ) as connections 
FROM 
    termLinks 

그래서 두 번째 경우에 대해서는

termLinks_t1   termLinks_t2 connections 
Leonardo Da Vinci Italy   Michelangelo, Lorenzo de’ Medici 

(딥 링크)을 (미켈란젤로, 그렇지 않으면 connections 그냥 것, 로렌초 데 메디치는 링크로 이탈리아를 가지고 가정) 뭔가를 반환내가 뭔가 나쁜 reedit을 발견하면 확실하지 않습니다.