2014-05-14 1 views
1

Je veux retourner pour chaque mot-clé dans la collection deux utilisateurs les plus liés au mot-clé. La requête ci-dessous fonctionne correctement avec un seul mot-clé.neo4j boucle de chiffrement pour renvoyer deux correspondances pour chaque élément de collection

WITH 
    'meeting' AS keyword 
MATCH 
    (k:keywords)<-[r1:RELATED]-(u:users) 
WHERE 
    k.keyword = keyword 
    AND NOT u:deactivated 
    AND NOT u.userid1 = 'administrator' 
    AND NOT k:deleted 
    AND r1.datedeleted = 0 
    AND r1.datedeleted IS NOT NULL 
WITH 
    DISTINCT u.userid1 AS user, 
    r1.weight AS rel 
ORDER BY 
    rel DESC 
LIMIT 2 
RETURN 
    user 
LIMIT 20 

Comment faire une boucle à la même requête ci-dessus pour chaque élément de collection? (Par exemple la collecte ci-dessous)

WITH 
['meeting', 'new', 'tool', 'training', 'it', 'process', 'server'] AS kw_my_channels 

Plus précisément, je besoin d'une boucle Cypher pour faire ma requête pour chaque élément de collection (mots-clés) de retour d'une requête effectuée avant (définie ici manuellement kw_my_channels). Le problème consiste à implémenter une boucle "for", qui exécute un MATCH pour chaque élément de collection. Dans ce cas, les éléments sont des mots-clés liés aux utilisateurs. La relation a des poids (pertinence du mot-clé pour cet utilisateur). Ces poids indiquent à quelle fréquence un mot-clé a été utilisé par l'utilisateur (nombre). Pour chaque mot clé, deux utilisateurs avec les poids les plus élevés doivent être trouvés.

Un exemple de sortie devrait ressembler à:

Keyword | Users   | Weight 
------------------------------- 
meeting | user1, user2 | 80, 75 
new  | user1, user4 | 40, 34 
tool | user5, user8 | 33, 22 
+1

À l'avenir, vous serez en mesure d'utiliser UNWIND pour ceci: 'UNWIND [....] comme mot-clé MATCH ....' –

Répondre

1

Vous pouvez essayer:

MATCH (k:keywords)<-[r1:RELATED]-(u:users) 
WHERE k.keyword IN ['meeting', 'new', 'tool', 'training', 'it', 'process', 'server'] 
AND ... 

Etc.

MISE À JOUR

Pouvez-vous faire quelque chose comme ça?

WITH 
    'meeting' AS keyword 
MATCH 
    (k:keywords)<-[r1:RELATED]-(u:users) 
WHERE 
    k.keyword = keyword 
    AND NOT u:deactivated 
    AND NOT u.userid1 = 'administrator' 
    AND NOT k:deleted 
    AND r1.datedeleted = 0 
    AND r1.datedeleted IS NOT NULL 
WITH 
    DISTINCT u.userid1 AS user, 
    r1.weight AS rel 
ORDER BY 
    u.userid1 DESC, rel DESC 
RETURN 
    user 
LIMIT <# of distinct users * 2> 

Notez la suppression de la « LIMITE 2 », le changement du changement « ORDER BY », et la « limite » au fond. Bien sûr, cela suppose que chaque mot-clé a au moins deux utilisateurs distincts attachés à celui-ci. Cela pourrait être un non-démarreur pour vous.

Etes-vous capable d'insérer par programme/dynamiquement une valeur pour < # d'utilisateurs distincts * 2> dans la requête? Ce serait bien si vous pouviez utiliser quelque chose comme "LIMIT COUNT (user) * 2" mais cela n'est pas valide dans Cypher. Malheureusement, je ne pense pas que Cypher vous permette actuellement d'utiliser FOREACH pour autre chose que des opérations de mutations.

Espérons que cela vous soit utile.

+0

Oui, j'ai essayé, mais si je veux 20 utilisateurs en tout (à la fin) Je reçois seulement 20 utilisateurs liés à la première, ou deux, dépend du nombre de mots clés. Je veux recommander les utilisateurs où toujours 2 utilisateurs sont liés à un mot-clé et ainsi de suite. Il est également discutable, est-ce qu'il fonctionne mieux d'appeler la première déclaration de chiffrement pour chaque mot clé de PHP? Je voudrais le comparer ... – kosmica

+0

Je suis désolé; Je ne comprends vraiment pas ce que vous demandez. Peut-être pouvez-vous fournir un diagramme ou un tableau ASCII décrivant certains résultats attendus. Ou, mieux encore, un exemple de console sur console.neo4j.org. – BtySgtMajor

+0

Donc, essayé de l'expliquer plus précisément (voir ci-dessus), espérons que cela aide. – kosmica

Questions connexes