0
votes

Filtrer une recherche complète avec une contrainte de relation

J'essaie actuellement de filtrer les nœuds extraits d'une recherche FUNTLEXTEXT en fonction d'une relation existante.

Voici le code (veuillez noter le "NOTE SUR Comment filtrer correctement" Line P>

CALL db.index.fulltext.queryNodes(
    "titleAndKeywords", 
    $search_text) 
YIELD node
WITH node
    WHERE $label in labels(node)
OPTIONAL MATCH // <-- not sure how to properly filter
    (a:Account {
            id : $account_id
        })
    -[:MEMBER]->
    (node)
    WHERE a IS NOT null
WITH
    node,
    COLLECT(node) AS nodes,
    COUNT(node) AS total
OPTIONAL MATCH
    (node)
    WHERE
        node.account_id = $account_id
WITH
    nodes + COLLECT(node) AS n,
    total + COUNT(node) AS total
UNWIND n AS node
WITH
    node,
    total
        SKIP $skip
        LIMIT $limit
WITH
    COLLECT(node) AS results,
    total
RETURN results, total


0 commentaires

3 Réponses :


1
votes

Je ne sais pas de quoi essayez-vous d'atteindre, mais il y a quelques drapeaux rouges dans votre requête, je voudrais souligner. XXX

Lors de l'agrégation du chiffre, il utilise Un regroupement implicite, ce qui signifie que toutes les colonnes de l'instruction avec sont automatiquement utilisées pour agréger ou un groupe de groupes SQL. Donc, votre instruction ci-dessus ne collectera toujours que 1 noeud et le compte sera également 1.

Suivant, vous avez déjà une variable de nœud déclarée, mais vous l'utilisez dans le match en option , qui est étrange et probablement faux. xxx

C'est probablement aussi l'endroit où vous créez plus de doublons.

Si vous ne voulez que filtrer Sur les nœuds qui ont une relation de membre à l'ID de compte spécifique, j'utiliserais la requête suivante: xxx


2 commentaires

Je travaille actuellement dessus. J'ai réalisé que je pouvais faire quelque chose comme nœud = autre_node , et ils correspondent parfaitement (essentiellement comme une jointure intérieure). Mais je vais donner à vos questions un essai. Donc, la seconde optionnel tente de trouver uniquement des nœuds qui ont la correspondance Compte_id sur elle.


J'ai trouvé une requête qui fait ce que je veux. S'il vous plaît vérifier et laissez-moi savoir si vous pensez que tout pourrait être amélioré



0
votes

C'est ce que je suis arrivé à la fin, à l'aide de la correspondance de nœud

CALL {
    MATCH 
        (a:Account { 
                id : $account_id 
            })
        -[:MEMBER]->
        (n1:Workspace)
    RETURN n1 AS n
    
    UNION
    
    MATCH
        (n2:Workspace { 
            account_id : $account_id
        })
    RETURN n2 AS n
}

CALL db.index.fulltext.queryNodes(
    "titleAndKeywords", 
    $search_text) 
YIELD node

WITH n, node
    WHERE n = node

WITH
    COLLECT(n) AS results,
    COUNT(n) AS total
    
RETURN results[$skip..$skip + $limit] AS results, total


2 commentaires

Si vous avez une garantie que la première partie de la requête avant la recherche FT ne renvoie toujours qu'un seul noeud, alors c'est bien. Si cette garantie n'existe pas, vous pouvez utiliser "N dans le nœud"


@ Tomažbratanič Je reçois une erreur lorsque j'utilise "In". Je pense que c'est parce que nœud n'est pas une liste. Semble fonctionner bien avec =



1
votes

Avez-vous essayé, au lieu d'une correspondance optionnelle

où (A: Compte { ID: $ compte_id }) - [: membre] -> (noeud))


1 commentaires

Je ne me suis pas réalisé que vous pourriez le faire. Je vais essayer quelque chose comme ça si mes futures requêtes ont ce type d'exigence.