Vue d’ensemble
La clause de modèle k-hop khop().n()...n()
utilise un modèle de chemin pour interroger les voisins à k sauts des nodes de départ dans les chemins.
Avec le modèle de chemin défini, la valeur de k dépend de la distance la plus courte entre deux nodes, comme expliqué dans la clause k-hop. De plus, les nodes retournés doivent satisfaire la condition définie pour les nodes de destination dans le modèle de chemin.
K-Hop vs. Modèle K-Hop
K-Hop |
Modèle K-Hop |
|
---|---|---|
Nœuds de départ | Unique | Unique ou multiple |
Règles de filtrage pour les arêtes | Toutes identiques | Peuvent être différentes |
Règles de filtrage pour les nodes autres que les nodes de départ | Toutes identiques | Peuvent être différentes |
Modèle de Chemin vs. Modèle K-Hop
Tout en réalisant la même fonction de requête, le modèle K-Hop offre généralement de meilleures performances que le modèle de chemin.
Par exemple, les deux UQLs renvoient les mêmes résultats - le nombre d'annonces distinctes cliquées par un utilisateur. Il est important de noter que les nodes de destination retournés par le modèle de chemin ne sont pas automatiquement dédupliqués, alors que les résultats du modèle k-hop sont dédupliqués.
// Modèle de Chemin
n({_id == "u316591"}).e({@clicks}).n({@ad} as ads)
return count(DISTINCT ads)
// Modèle K-Hop
khop().n({_id == "u316591"}).e({@clicks}).n({@ad}) as ads
with count(ads)
Syntaxe
- Alias de clause : type NOEUD
- Concernant le modèle de chemin :
- Le
n()
initial doit avoir un filtre valide qui peut spécifier plusieurs nodes. - Les
[<steps>]
dans les modèles multi-arêtese()[<steps>]
ete().nf()[<steps>]
ne prennent pas en charge le format[*:N]
, car la requête k-hop traverse automatiquement les chemins les plus courts. - Le filtrage entre les étapes n'est pas pris en charge, que ce soit en utilisant un alias système (
prev_n
,prev_e
) ou un alias personnalisé.
- Le
- Méthodes :
Méthode |
Type de Param |
Spéc. Param |
Obligatoire |
Description | Alias |
---|---|---|---|---|---|
limit() |
Entier | ≥-1 | Non | Nombre de voisins à k sauts à retourner pour chaque nœud de départ (notez que ce n'est pas pour chaque sous-requête), -1 signifie retourner tous |
N/A |
Exemples
Exemple de Graph
Exécutez ces UQLs ligne par ligne dans un graphset vide pour créer ce graph :
create().node_schema("country").node_schema("movie").node_schema("director").node_schema("actor").edge_schema("filmedIn").edge_schema("direct").edge_schema("cast").edge_schema("bornIn")
create().node_property(@*, "name")
insert().into(@country).nodes([{_id:"C001", _uuid:1, name:"France"}, {_id:"C002", _uuid:2, name:"USA"}])
insert().into(@movie).nodes([{_id:"M001", _uuid:3, name:"Léon"}, {_id:"M002", _uuid:4, name:"The Terminator"}, {_id:"M003", _uuid:5, name:"Avatar"}])
insert().into(@director).nodes([{_id:"D001", _uuid:6, name:"Luc Besson"}, {_id:"D002", _uuid:7, name:"James Cameron"}])
insert().into(@actor).nodes({_id:"A001", _uuid:8, name:"Zoe Saldaña"})
insert().into(@filmedIn).edges([{_uuid:1, _from_uuid:3, _to_uuid:1}, {_uuid:2, _from_uuid:4, _to_uuid:1}, {_uuid:3, _from_uuid:4, _to_uuid:2}, {_uuid:4, _from_uuid:5, _to_uuid:2}])
insert().into(@direct).edges([{_uuid:5, _from_uuid:6, _to_uuid:3}, {_uuid:6, _from_uuid:7, _to_uuid:4}, {_uuid:7, _from_uuid:7, _to_uuid:5}])
insert().into(@cast).edges([{_uuid:8, _from_uuid:8, _to_uuid:5}])
insert().into(@bornIn).edges([{_uuid:9, _from_uuid:8, _to_uuid:2}])
Définir un Chemin de Longueur Fixe
Trouver les voisins à 2 sauts de chaque pays qui peuvent être atteints par un certain chemin.
khop().n({@country} as a).le({@filmedIn}).n({@movie}).le({@direct}).n({@director}) as b
return table(a.name, b.name)
Résultat :
a.name | b.name |
---|---|
USA | James Cameron |
France | James Cameron |
France | Luc Besson |
Définir un Chemin de Longueur Non Fixe
Trouver les voisins à 1 et 2 sauts de chaque pays qui peuvent être atteints par un certain chemin.
khop().n({@country} as a).e({!@direct})[:2].n({!@country}) as b
return table(a.name, b.name)
Résultat :
a.name | b.name |
---|---|
USA | Zoe Saldaña |
USA | The Terminator |
USA | Avatar |
France | The Terminator |
France | Léon |
Filtrage des Nœuds de Destination
Trouver les voisins @director à 2 sauts de chaque pays.
khop().n({@country} as a).e()[2].n({@director}) as b
return table(a.name, b.name)
Résultat :
a.name | b.name |
---|---|
USA | James Cameron |
France | James Cameron |
France | Luc Besson |
Prendre le Chemin le Plus Court
Trouver les voisins @country à 2 sauts d'un acteur.
khop().n({@actor.name == "Zoe Saldaña"}).e()[2].n({@country}) as a return a
Résultat : Pas de données retournées.
Même s'il existe un chemin en 2 étapes de l'acteur à un pays (Zoe Saldaña - [@cast] - Avatar - [filmedIn]- USA
), ce n'est pas le chemin le plus court (Zoe Saldaña - [@bornIn] - USA
) entre eux.
Utiliser limit()
Trouver un voisin à 1 saut pour chaque réalisateur qui peut être atteint par un certain chemin.
khop().n({@director} as a).e({@direct}).n().limit(1) as b
return table(a.name, b.name)
Résultat :
a.name | b.name |
---|---|
James Cameron | The Terminator |
Luc Besson | Léon |
Utiliser OPTIONAL
Trouver les voisins @actor à 2 sauts de chaque pays qui peuvent être atteints par un certain chemin. Retourner null si aucun voisin n'est trouvé.
find().nodes({@country}) as cty
optional khop().n(cty).e({!@bornIn})[2].n({@actor}) as actor
return table(cty.name, actor.name)
Résultat :
cty._id | actor._id |
---|---|
France | null |
USA | Zoe Saldaña |