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
3 Réponses :
Je ne sais pas de quoi essayez-vous d'atteindre, mais il y a quelques drapeaux rouges dans votre requête, je voudrais souligner. Lors de l'agrégation du chiffre, il utilise Un regroupement implicite, ce qui signifie que toutes les colonnes de l'instruction code> avec code> 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. P> Suivant, vous avez déjà une variable de nœud déclarée, mais vous l'utilisez dans le match C'est probablement aussi l'endroit où vous créez plus de doublons. p> 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: p> en option code>, qui est étrange et probablement faux. p>
Je travaille actuellement dessus. J'ai réalisé que je pouvais faire quelque chose comme nœud = autre_node code>, et ils correspondent parfaitement (essentiellement comme une jointure intérieure). Mais je vais donner à vos questions un essai. Donc, la seconde code> optionnel code> tente de trouver uniquement des nœuds qui ont la correspondance
Compte_id code> 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é
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
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 code> n'est pas une liste. Semble fonctionner bien avec
= code>
Avez-vous essayé, au lieu d'une correspondance optionnelle p>
où (A: Compte { ID: $ compte_id }) - [: membre] -> (noeud)) p>
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.