2016-03-01 1 views
0

Je suis this tutorial sur les filtres collaboratifs dans Neo4j. Dans ce tutoriel, nous créons d'abord un graphique de film de jouet, comme suit:Génération de N recommandations par personne dans Neo4J

LOAD CSV WITH HEADERS FROM "https://neo4j-contrib.github.io/developer-resources/cypher/movies_actors.csv" AS line 
WITH line 
WHERE line.job = "ACTED_IN" 
MERGE (m:Movie {title:line.title}) ON CREATE SET m.released = toInt(line.released), m.tagline = line.tagline 
MERGE (p:Person {name:line.name}) ON CREATE SET p.born = toInt(line.born) 
MERGE (p)-[:ACTED_IN {roles:split(line.roles,";")}]->(m) 
RETURN count(*); 

Ensuite, nous proposons cinq possibles co-acteurs de Tom Hanks:

MATCH (tom:Person)-[:ACTED_IN]->(movie1)<-[:ACTED_IN]-(coActor:Person), 
     (coActor)-[:ACTED_IN]->(movie2)<-[:ACTED_IN]-(coCoActor:Person) 
WHERE tom.name = "Tom Hanks" 
AND NOT (tom)-[:ACTED_IN]->()<-[:ACTED_IN]-(coCoActor) 
RETURN coCoActor.name, count(distinct coCoActor) as frequency 
ORDER BY frequency DESC 
LIMIT 5 

si je veux effectuer un tel une opération sur chaque personne qui a agi dans "Apollo 13"? En d'autres termes, ma tâche est de proposer 5 co-acteurs possibles à chaque personne qui a joué dans "Apollo 13". Comment le faire de manière efficace?

+0

Les « co-acteurs "La requête que vous avez postée récupère en fait des co-co-acteurs qui n'ont pas travaillé avec Tom Hanks. Pouvez-vous clarifier ce dont vous avez besoin? – Mikesname

+0

Je suis en train de coller un exemple à partir d'une page Web. Et vous avez raison, le but est de trouver des co-co-acteurs qui ont le potentiel de devenir co-acteurs –

Répondre

2

Quelques petites choses ici. La requête que vous avez collé ne fait pas vraiment de sens:

RETURN coCoActor.name, COUNT(DISTINCT coCoActor) AS frequency 

Cela renverra toujours une fréquence de 1, de sorte que votre ORDER BY n'a pas de sens.

Je pense que vous vouliez dire ceci:

RETURN coCoActor.name, COUNT(DISTINCT coActor) AS frequency 

La deuxième chose est que vous n'avez pas besoin des variables movie1 et movie2; ils ne sont plus utilisés dans votre requête.

Enfin, vous devez affirmer que vous n'êtes pas recommander le même acteur lui-même:

WHERE actor <> coCoActor

Pour répondre effectivement à votre question:

// Find the Apollo 13 actors. 
MATCH (actor:Person)-[:ACTED_IN]->(:Movie {title:"Apollo 13"}) 

// Continue with query. 
MATCH (actor)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coActor:Person), 
     (coActor)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coCoActor:Person) 
WHERE NOT (actor)-[:ACTED_IN]->(:Movie)<-[:ACTED_IN]-(coCoActor) AND 
     actor <> coCoActor 

// Group by actor and coCoActor, counting how many coActors they share as freq. 
WITH actor, coCoActor, COUNT(DISTINCT coActor) AS freq 

// Order by freq descending so that COLLECT()[..5] grabs the top 5 per row. 
ORDER BY freq DESC 

// Get the recommendations. 
WITH actor, COLLECT({name: coCoActor.name, freq: freq})[..5] AS recos 
RETURN actor.name, recos; 
+0

Les derniers ordres ORDER BY par la fréquence. Venez venir les résultats sont regroupés par «acteur»? Est-ce que la dernière instruction 'WITH' assure cela? –