Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wordnet-Abfrage, um Beispielsätze zurückzugeben

Die Sätze können Sie den samples entnehmen Tisch. Beispiel:

SELECT sample FROM samples WHERE synsetid = 201062889;

ergibt:

Sie könnten Ihre Abfrage also wie folgt erweitern:

SELECT 
    a.lemma AS `word`,
    c.definition,
    c.pos AS `part of speech`,
    d.sample AS `example sentence`,
    (SELECT 
            GROUP_CONCAT(a1.lemma)
        FROM
            words a1
                INNER JOIN
            senses b1 ON a1.wordid = b1.wordid
        WHERE
            b1.synsetid = b.synsetid
                AND a1.lemma <> a.lemma
        GROUP BY b.synsetid) AS `synonyms`
FROM
    words a
        INNER JOIN
    senses b ON a.wordid = b.wordid
        INNER JOIN
    synsets c ON b.synsetid = c.synsetid
        INNER JOIN
    samples d ON b.synsetid = d.synsetid
WHERE
    a.lemma = 'carry'
ORDER BY a.lemma , c.definition , d.sample;

Hinweis:Die Unterauswahl mit einem GROUP_CONCAT gibt die Synonyme jedes Sinnes als kommagetrennte Liste in einer einzelnen Zeile zurück, um die Anzahl der Zeilen zu reduzieren. Sie können diese in einer separaten Abfrage (oder als Teil dieser Abfrage, aber mit allem anderen dupliziert) zurückgeben, wenn Sie dies bevorzugen.

AKTUALISIEREN Wenn Sie wirklich Synonyme als Zeilen in den Ergebnissen benötigen, wird dies wie folgt getan, aber ich würde es nicht empfehlen:Synonyme und Beispielsätze gehören beide zu einer bestimmten Definition, sodass der Satz von Synonymen für jeden Beispielsatz dupliziert wird. Z.B. Wenn es 4 Beispielsätze und 5 Synonyme für eine bestimmte Definition gibt, würden die Ergebnisse 4 x 5 =20 Zeilen nur für diese Definition haben.

SELECT 
    a.lemma AS `word`,
    c.definition,
    c.pos AS `part of speech`,
    d.sample AS `example sentence`,
    subq.lemma AS `synonym`
FROM
    words a
        INNER JOIN
    senses b ON a.wordid = b.wordid
        INNER JOIN
    synsets c ON b.synsetid = c.synsetid
        INNER JOIN
    samples d ON b.synsetid = d.synsetid
        LEFT JOIN
    (SELECT 
        a1.lemma, b1.synsetid
    FROM
        senses b1
    INNER JOIN words a1 ON a1.wordid = b1.wordid) subq ON subq.synsetid = b.synsetid
        AND subq.lemma <> a.lemma
WHERE
    a.lemma = 'carry'
ORDER BY a.lemma , c.definition , d.sample;