Requête Cypher: exclusion de noeuds

66 views
Skip to first unread message

Régis Gaidot

unread,
Oct 21, 2015, 8:16:08 AM10/21/15
to Neo4jFr

Bonjour,


J'essaye de trouver le moyen d'exclure des nœuds à travers une requête cypher. Mon graph se compose:

  • d'utilisateur,
  • de compétence,
  • de score,
  • de question,
  • d'approbation

Dans la pratique:
  • Un utilisateur a des compétences,
  • Une compétence a des scores - en relation avec des questions ((compétence) -> (scores) -> (questions))
  • Une approbation est une relation utilisateur/score ((utilisateur) <- (réponse) <- (scores) <- (...))
  • Une question est en relation avec des scores ((question) -> (score) ... (question) -> (score) ... (question) -> (score), etc...)

J'aimerais récupérer toutes les questions pour un utilisateur dont-il n'a pas encore eu de score. Je pensais que je pouvais faire:

MATCH (u:`Graph::User`),
u<-[rel1:`USERS`]-(s:`Graph::SoftSkill`),
s-[rel2:`SOFT_SKILLS`]->(k:`Graph::SoftSkillScoring`),
k-[rel3:`ANSWER`]->(q:`Graph::Question`)
WHERE (u.uid='e7bazec-ea14-4reb-55cd-56c922945c6a') AND NOT (u<-[:ENDORSEMENT]-()<-[:ENDORSEMENT]->(k))
RETURN q, u

Le résultat obtenu inclut toujours les questions dont l'utilisateur a déjà des scores - ce qui me semble logiques,  au vu de la relation question/scores - mais ce qui ne me convient naturellement pas :-)

Avez-vous une suggestion? Votre aide me sera précieuse.

Merci



Sylvain Roussy

unread,
Oct 21, 2015, 5:34:03 PM10/21/15
to Neo4jFr
Bonsoir,
de ce que je comprends (il faut le temps de plonger dedans), le score est un score de réponse ou un score à obtenir pour avoir 100% de bonnes réponses ?
Je ne comprend pas bien le pattern NOT (u<-[:ENDORSEMENT]-()<-[:ENDORSEMENT]->(k), mais peut-être que c'est moi. Pouvez-vous compléter votre énoncé ?

Benoit Simard

unread,
Oct 22, 2015, 8:37:21 AM10/22/15
to neo...@googlegroups.com
Bonjour,

J'ai un peu de mal à  comprendre le modèle du graph.
Avez-vous une représentation du méta-modèle ?

Exemple :  le noeud 'SoftSkillScoring' n'est pas lié à l'utilisateur, or d'après ce que je comprend c'est le score de l'utilisateur.

Sincèrement.

Régis Gaidot

unread,
Nov 5, 2015, 4:39:47 AM11/5/15
to Neo4jFr
Bonjour et merci,

Voici un schema grossier afin de vous représenter les relations et les noeuds.
Dans cette représentation le but serait de récupérer la question (Question #2) dont l'utilisateur (User #1) n'a pas encore d'approbation (ENDORSEMENT) - pour rappel les utilisateurs sont abonnés à des compétences (SoftSkill)
Je vous remercie de votre aide par avance. 


Benoit Simard

unread,
Nov 8, 2015, 6:10:03 PM11/8/15
to neo...@googlegroups.com
Bonjour,

Merci pour le schema.

Est-ce que cette requête conviendrait ?

MATCH
  // le user
  (u:Graph::User {uid='e7bazec-ea14-4reb-55cd-56c922945c6a'}),
  // les questions en liaison avec le user
  (u)-[:SUBSCRIBE]->(:SoftSkill)-[:SoftSkill]->(:SoftSkillScore)-[:ANSWER]->(question:Question)
WHERE
 // acun chemin d'endrosement entre la question et le user
  NOT ((question)<-[:ANSWER]-(:SoftSkillScore)-[:ENDORSEMENT]->(:Approval)->(u))
RETURN DISTINCT question

Je pense que le problème de votre requête,  provient du fait qu'une question possède plusieurs SoftSkill, et donc plusieurs "endorsement". Or vous ne testiez la non-existance qu'à partir d'un ScoreSkill et non de tout les ScoreSkill de la question. Est-ce bien ça ?

Sincèrement.

Régis Gaidot

unread,
Nov 9, 2015, 8:59:01 AM11/9/15
to Neo4jFr

Bonjour et merci beaucoup, votre réponse a pu m'aiguiller sur une solution!
Reply all
Reply to author
Forward
0 new messages