我的目标是建立一个术语知识图;每个学期;我可以(不知何故很容易)从该术语中提取直接连接到所有其他术语;下表(可以存储在MySQL中)是我可以提取的一个例子:
在上表的每一行中;我们看到一个即时(UNDIRECTED)连接,以及它的重量(或强度)。 请注意,所有连接都是无向的。
所以问题是;我们可以找出间接的术语之间的联系吗?例如; 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’ Medici
和Michelangelo
之间存在以下关联:
Lorenzo de’ Medici -- Renaissance -- Leonardo Da Vinci -- Italy -- Michelangelo
提取所有术语之间所有联系的最佳方法是什么?我知道这可能是一个非常复杂的问题需要解决;但我愿意接受任何建议,我可以建立一个数据结构,我可以用来相当有效地提取所有连接......
答案 0 :(得分: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
至于第二种情况(深层链接),不确定我是否发现了一些不合理的情况。