J'essaie de créer une requête en utilisant un chiffrement qui «trouvera» 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 nom = "couleurs de teinture". (ingredient_value)
pourrait avoir une clé / valeur de valeur = "rouge" et "fait partie de" le (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
valeurs, mais pas leurs valeurs réelles, requises par une recette, mais je voudrais le retour uniquement de ce ingredients
que le chef n'a pas, au lieu de tous les ingrédients requis par chaque recette. j'ai essayé
(chef)-[:has_value]->(ingredient_value)<-[:requires_value]-(recipe)-[:requires_ingredient]->(ingredient)<-[:has_ingredient*0..0]-chef
mais cela ne retourna rien.
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: il existe également un moyen d'utiliser le chiffrement pour faire correspondre toutes les valeurs d'un chef à toutes les valeurs requises par une recette. Jusqu'à présent, je n'ai renvoyé que toutes les correspondances partielles renvoyées par a chef-[:has_value]->ingredient_value<-[:requires_value]-recipe
et j'ai agrégé les résultats moi-même.
exists
dans uneWHERE
clause (également l'annuler), neo4j.com/developer/subqueries/#existential-subqueries pour plus d'informations.Réponses:
Mise à jour du 01/10/2013:
Je suis tombé sur cela dans la référence Neo4j 2.0 :
Essayez de ne pas utiliser de relations facultatives. Par dessus tout,
ne les utilisez pas comme ceci:
MATCH a-[r?:LOVES]->() WHERE r IS NULL
où vous vous assurez simplement qu'ils n'existent pas.Faites plutôt ceci comme ceci:
Utilisation de chiffrement pour vérifier si la relation n'existe pas:
Le ? mark rend la relation facultative.
OU
Dans neo4j 2, faites:
Vous pouvez maintenant rechercher une relation non existante (nulle).
la source
MATCH a...
exemple devrait maintenant êtreMATCH (a) WHERE NOT (a)-[:LOVES]->()
Pour récupérer des nœuds sans aucune relation
C'est la bonne option pour vérifier que la relation existe ou non
Vous pouvez également vérifier plusieurs conditions pour cela. Il renverra tous les nœuds, qui n'ont pas de relation "joué" ou "non joué".
Pour récupérer des nœuds qui n'ont pas de relation réelle
Il vérifiera que le nœud n'a aucune relation entrante / sortante.
la source
MATCH (player) WHERE NOT (player)-[r]-() RETURN player
donne une erreur de variable r non définie . Comment définir r?(player -[:rel]- ()
) ou laissez vide pour toute relation(player -[]- ()
MATCH (player) WHERE NOT (player)-[]-() RETURN player
- Cela fonctionne bienSi vous avez besoin d'une sémantique "d'exclusion conditionnelle", vous pouvez y parvenir de cette façon.
À partir de neo4j 2.2.1, vous pouvez utiliser la
OPTIONAL MATCH
clause et filtrer lesNULL
nœuds sans correspondance ( ).Il est également important d'utiliser une
WITH
clause entre les clausesOPTIONAL MATCH
etWHERE
, afin que la premièreWHERE
définisse une condition pour la correspondance facultative et la secondeWHERE
se comporte comme un filtre.En supposant que nous ayons 2 types de nœuds:
Person
etCommunication
. Si je veux obtenir toutes les personnes qui n'ont jamais communiqué par téléphone, mais qui ont pu communiquer par d'autres moyens, je ferais cette requête:Le modèle de correspondance correspondra à toutes les personnes avec leurs communications où
c
seraNULL
pour les communications non téléphoniques. Puis le filtre (WHERE
aprèsWITH
) filtrera les communications téléphoniques en laissant toutes les autres.Références:
http://neo4j.com/docs/stable/query-optional-match.html#_introduction_3 http://java.dzone.com/articles/new-neo4j-optional
la source
J'ai écrit un résumé montrant comment cela peut être fait assez naturellement en utilisant Cypher 2.0
http://gist.neo4j.org/?9171581
Le point clé est d'utiliser une correspondance facultative avec les ingrédients disponibles, puis de comparer pour filtrer les ingrédients manquants (nuls) ou les ingrédients avec la mauvaise valeur.
Notez que la notion est déclarative et n'a pas besoin de décrire un algorithme, vous écrivez simplement ce dont vous avez besoin.
la source
J'ai terminé cette tâche en utilisant gremlin. J'ai fait
Cela a renvoyé les chemins de tous les ingrédients manquants. Je n'ai pas pu formuler cela en langage chiffré, du moins pour la version 1.7.
la source
La dernière requête doit être:
Ce modèle:
(ingredient)<-[:has_ingredient*0..0]-chef
C'est la raison pour laquelle il n'a rien retourné.
*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 qu'ils ne sont pas.la source