2017-03-15 3 views
0

Ich versuche, die Scheitelpunktpaare zu finden, die die größte Anzahl gemeinsamer Scheitelpunkte zwischen ihnen haben. Es ist dem "Anzahl der gemeinsamen Freunde" -Beispiel sehr ähnlich, das in vielen Graphendatenbankdemos verwendet wird. Ich kann die Anzahl der gegenseitigen Vertices zwischen einem Paar von bekannten Vertices unter Verwendung dieser Bestimmung:OrientDb Vertices mit den meisten gemeinsamen Freunden

SELECT Expand($query) LET 
    $query1 = (SELECT Expand(outE().in) FROM #1:2, 
    $query2 = (SELECT Expand(OutE().in) FROM #1:3, 
    $query = Intersect($query1,$query2); 

Der Count() der obigen Abfrage Ergebnis ist die Anzahl gemeinsamer Vertices.

Ich kann jedoch nicht herausfinden, wie diese Abfrage über meine gesamte Datenmenge aggregieren. Meine beste Lösung war eine Brute-Force-Methode, bei der ich jeden Eckpunkt durchlaufen und die obige Abfrage gegen alle anderen Knoten ausführen kann (technisch gesehen mache ich alle Vertices nach diesem Eckpunkt).

Meine Lösung ist ineffizient und musste in C# anstatt in SQL vollständig codiert werden. Wie kann dies mit OrientDb's SQL gemacht werden?

Antwort

1

Sie können eine SELECT mit einer MATCH verwenden:

SELECT FROM (
    SELECT a, b, count(friend) as nFriends from (
    MATCH 
     {class:Person, as:a} -FriendOf- {as:friend} -FriendOf-{as:b, where:($matched.a != $currentMatch)} 
    RETURN a, b, friend 
) 
) ORDER BY nFriends 
+0

Vielen Dank! Ich musste es etwas anpassen, aber Sie haben mich dort 99,99%. –

0

Leichte Änderung @ Luigi Antwort:

SELECT a, b, Count(friend) AS nFriends FROM (
    MATCH 
    {class:Person, as:a} -E- {as:friend} -E- {class:Person, as:b, where:($matched.a != $currentMatch)} 
    RETURN a, b, friend 
) GROUP BY a, b ORDER BY nFriends DESC 

ich die GROUP BY benötigt oder bekomme ich nur eine große Zählung.

Verwandte Themen