93 votes

Renvoyer le nœud si la relation n'est pas présente

J'essaie de créer une requête à l'aide de cypher pour "trouver" les ingrédients manquants qu'un chef pourrait avoir. Mon graphique est configuré comme suit :

(ingredient_value)-[:is_part_of]->(ingredient)

(ingredient) aurait une clé/valeur de name="dye colors". (ingredient_value) pourrait avoir une clé/valeur de valeur="rouge" et "fait partie" de l'élément (ingredient, name="dye colors") .

(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)

J'utilise cette requête pour obtenir toutes les ingredients mais pas leurs valeurs réelles, ce qui est nécessaire pour une recette, mais je voudrais que le retour ne concerne que les éléments suivants ingredients que le chef n'a pas, au lieu de tous les ingrédients que chaque recette requiert. J'ai essayé

(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)<-[:has_ingredient*0..0]-chef

mais cela n'a rien donné.

Est-ce quelque chose qui peut être accompli par cypher/neo4j ou est-ce quelque chose qui est mieux géré en retournant tous les ingrédients et en les triant moi-même ?

Bonus : existe-t-il également un moyen d'utiliser Cypher pour faire correspondre toutes les valeurs que possède un chef à toutes les valeurs requises par une recette. Jusqu'à présent, je n'ai renvoyé que les correspondances partielles renvoyées par la fonction chef-[:has_value]->ingredient_value<-[:requires_value]-recipe et en agrégeant les résultats moi-même.

0 votes

Consultez ici les informations relatives à la v3 : stackoverflow.com/questions/25673223/

0 votes

Pour les futurs utilisateurs, vous pouvez utiliser exists dans un WHERE (la nier également), neo4j.com/developer/subqueries/#existential-subqueries pour plus d'informations.

2voto

Andres Points 972

La dernière requête devrait être :

START chef = node(..)
MATCH (chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)
WHERE (ingredient)<-[:has_ingredient]-chef
RETURN ingredient

Ce modèle : (ingredient)<-[:has_ingredient*0..0]-chef

C'est la raison pour laquelle ça n'a rien donné. *0..0 signifie que la longueur des relations doit être nulle, ce qui signifie que l'ingrédient et le chef doivent être le même nœud, ce qui n'est pas le cas.

0 votes

Oui, mais il ne renvoie pas l'ingrédient souhaité. Il renvoie ce que le chef a déjà en commun avec la recette, je veux trouver la différence.

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