2 votes

Filtrage des valeurs de la propriété d'une relation dans une requête avant de la renvoyer.

J'exécute une requête qui ressemble à ceci

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, relationships(p) AS re
RETURN *

Je veux filtrer le graphique pour supprimer toutes les instances où une RELB (une arête entre deux NODEB ) ne possède pas une propriété spécifique avant de revenir.

La requête fonctionne si je lie la relation à l'aide des éléments suivants [rels:RELB*] et filtrer sur rels mais je reçois un message disant que cette fonction est obsolète et qu'il faut utiliser la méthode suivante WITH *, relationships(p) à la place. Le message spécifique est

Cette fonctionnalité est obsolète et sera supprimée dans les prochaines versions. Lier des relations à une liste dans un modèle de longueur variable est déprécié. (La liaison d'un modèle de relation de longueur variable à une variable ('rels') est dépréciée et ne sera pas prise en charge dans une future version. La méthode recommandée est de lier le chemin entier à une variable, puis d'extraire les relations : MATCH p = (...)-[...]-(...) WITH *, relationships(p) AS rels)

J'ai essayé

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, relationships(p) AS re
WHERE ANY (thing IN re WHERE thing.prop = 'value')
RETURN *

Mais il semble toujours renvoyer la même chose que la première requête.

J'ai également essayé la compréhension de liste pour filtrer les relations.

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WITH *, [re in relationships(p) WHERE re.prop = 'value'] AS re
RETURN *

Mais je pense que cette approche présente quelques problèmes :

  1. relationships(p) semble être un tableau de tableaux en raison de la nature du graphique.
  2. il existe plusieurs types de relations dans les relations(p) ( RELA et RELB ) et je ne suis pas sûr de savoir comment prendre cela en compte

Je ne trouve pas vraiment de documentation en ligne sur la manière de filtrer les relations lorsqu'elles sont renvoyées sous forme de liste (en raison de l'utilisation de l'option de filtrage de l'utilisateur). * en [:RELB*] )

Je dois aussi noter que la propriété que je dois filtrer RELB on est un tableau et je vais vérifier s'il contient une valeur, donc je n'ai pas la possibilité d'utiliser quelque chose comme [:RELB*{prop: 'value'}] dans la requête (je ne l'ai pas inclus ci-dessus pour ne pas compliquer la question)

Toute aide est appréciée.

2voto

cybersam Points 37369

Depuis le rels est dépréciée (pour une raison quelconque), voici un équivalent plus lourd utilisant p = y RELATIONSHIPS(p) :

MATCH p = (n:NODEA)-[:RELA]->(s:NODEB)-[:RELB*]->(j:NODEB)
WHERE ALL(thing IN RELATIONSHIPS(p)[1..] WHERE thing.prop = 'value')
RETURN *

À propos, si votre requête prend beaucoup de temps et/ou manque de mémoire, vous pouvez mettre une limite supérieure raisonnable à votre modèle de relation de longueur variable (par ex, [:RELB*..6] ), car la complexité temporelle et spatiale d'un tel modèle croît de manière exponentielle avec la profondeur de la recherche.

[RÉPONSE ORIGINALE]

Cette requête utilise le rels pour contenir une liste de seulement les RELB relations :

MATCH (n:NODEA)-[:RELA]->(s:NODEB)-[rels:RELB*]->(j:NODEB)
WHERE ALL(thing IN rels WHERE thing.prop = 'value')
RETURN *

J'ai enlevé p = du motif, comme p n'est pas nécessaire pour cette requête. Si vous en avez besoin dans votre résultat, vous pouvez l'ajouter à nouveau (mais l'attribut rels La liste vous donnera tous les RELB relations, donc vous n'aurez peut-être pas besoin p ).

Vous devez utiliser le ALL() (pas ANY() ) si vous voulez exiger que tous les RELB pour avoir la valeur de propriété souhaitée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X