Encuentra "amigos de amigos" con OrientDB SQL

Aunque es uno de los casos de uso más comunes para demostrar las capacidades de una base de datos gráfica, parece que no puedo encontrar un buen ejemplo o una mejor práctica para obtener "amigos de amigos" con OrientDB SQL.

Asumamos una red social e intentemos modelarla con vértices de "usuario" y bordes "is_friend_with".

Definición:

Clase de vérticeusuario con propiedadesuuid (identificación única personalizada) ynombre

Clase de bordeis_friend_with con propiedadestado que puede ser "pendiente"o"aprobado"

Los usuarios están conectados entre sí con bordes unidireccionales. La dirección realmente no importa; mientras status = "aprobado", esos dos usuarios son amigos.

Esta es una solución que se me ocurrió:

select from (
    select expand($all) let
        $a = (select expand(outE('is_friend_with')[status='approved'].inV('user').outE('is_friend_with')[status='approved'].inV('user')) from (select from user where uuid = '95920a96a60c4d40a8f70bde98ae1a24')),
        $b = (select expand(outE('is_friend_with')[status='approved'].inV('user').inE('is_friend_with')[status='approved'].outV('user')) from (select from user where uuid = '95920a96a60c4d40a8f70bde98ae1a24')),
        $c = (select expand(inE('is_friend_with')[status='approved'].outV('user').inE('is_friend_with')[status='approved'].outV('user')) from (select from user where uuid = '95920a96a60c4d40a8f70bde98ae1a24')),
        $d = (select expand(inE('is_friend_with')[status='approved'].outV('user').outE('is_friend_with')[status='approved'].inV('user')) from (select from user where uuid = '95920a96a60c4d40a8f70bde98ae1a24')),
        $all = unionall($a, $b, $c, $d)
) where uuid <> '95920a96a60c4d40a8f70bde98ae1a24'

(El usuario con uuid = '95920a96a60c4d40a8f70bde98ae1a24' es el punto de partida).

Pero no me parece muy elegante. Algunos de los problemas que puedo detectar de inmediato son:

Repetición deselect from user where uuid = '95920a96a60c4d40a8f70bde98ae1a24'. Desafortunadamente, no pude encontrar una manera de asignarlo a una variable y luego usarlo en la cláusula "from"Me vi obligado a hacer todas las combinaciones de bordes / vértices entrantes / salientes en lugar de usar ambos (), ya que quiero verificar cada borde parastatus="approved"Esta consulta también devuelve los amigos directos, en lugar de solo amigos de amigos

Traté de usar la poligonal, pero fue en vano (de nuevo, no encontré una manera de verificar los bordes parastatus="approved" mientras atraviesa).

¿Podría, por favor, proponer alguna solución OSQL para este problema? Gracias por adelantado.

Respuestas a la pregunta(3)

Su respuesta a la pregunta