1

私の目標は、用語のナレッジ グラフを作成することです。各用語; その用語から他のすべての用語への直接的なつながりを (なんとなく簡単に) 抽出できます。次の表 (MySQL に格納できます) は、抽出できるものの例です。

ここに画像の説明を入力

上記の表の各行。1 つの直接的な (方向性のない) 接続と、その重み (または強さ) が表示されます。すべての接続は無向であることに注意してください。

問題は次のとおりです。間接的な用語間の接続を理解できますか? 例えば; Leonardo Da Vinciとの間の 1 つのリンクMichelangeloは、用語を通じて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およびそれMichelangeloを介した接続が存在します。

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

すべての用語間のすべての接続を抽出するための最良のアプローチは何でしょうか? これは解決すべき非常に複雑な問題である可能性があることを理解しています。しかし、すべての接続をかなり効率的に抽出するために使用できるデータ構造を構築できる可能性のある提案をお待ちしています...

4

1 に答える 1

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

したがって、次のようなものが返されます(ロレンツォ・デ・メディチもイタリアをリンクとして持っていると仮定します。そうでない場合connectionsはミケランジェロになります)

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

2番目のケース(ディープリンク)については、何か悪い再編集が見つかるかどうかわかりません。

于 2013-06-02T17:00:52.750 に答える