1

我的目标是建立术语的知识图谱;每个学期;我可以(以某种方式轻松地)从该术语中提取出与所有其他术语的直接联系;下表(可以存储在 MySQL 中)是我可以提取的示例:

在此处输入图像描述

在上表的每一行中;我们看到一个直接的(未定向的)连接,以及它的重量(或强度)。请注意,所有连接都是无向的。

所以问题是;我们能找出间接术语之间的联系吗?例如; Leonardo Da Vinci和之间的一个联系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’ MediciMichelangelo通过以下联系:

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

所以它会返回类似的东西(假设 Lorenzo de' Medici 也有意大利作为链接,否则connections只是米开朗基罗)

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

至于第二种情况(深层链接),我不确定我是否发现有问题重新编辑。

于 2013-06-02T17:00:52.750 回答