2015-10-02 15 views
5

Ho un grafico che utilizza NEO4j e attualmente sto cercando di creare un sistema di raccomandazione semplice che sia migliore della ricerca basata su testo.Il DB grafico ottiene il prossimo nodo consigliato migliore in Neo4j cypher

nodi vengono creati come ad esempio: Album, Persone, Tipo, Grafico

relazione vengono creati come ad esempio:

People - [:role] -> Album dove i ruoli sono: Artista, Produttore, Autore di canzoni

Album-[:is_a_type_of]->Type (tipo è in pratica Pop, Rock, Disco ...)

People -[:POPULAR_ON]->Chart (Il grafico è quello che potrebbe essere stato Billboard)

People -[:SIMILAR_TO]->People (collegamento somiglianza predeterminato)

ho scritto il seguente cifra:

MATCH (a:Album { id: { id } })-[:is_a_type_of]->(t)<-[:is_a_type_of]-(recommend)  
    WITH recommend, t, a 
    MATCH (recommend)<-[:ARTIST_OF]-(p) 
    OPTIONAL MATCH (p)-[:POPULAR_ON]->() 
    RETURN recommend, count(DISTINCT t) AS type 
    ORDER BY type DESC 
    LIMIT 25; 

Funziona tuttavia, si ripete facilmente se si ha un solo tipo di musica ad esso collegato, ha quindi la gli stessi vicini.

Esiste un modo suggerito di dire:

  • a trovare la miglior album successivo che ha i rapporti connessi più simili a quelle del album a partire da.
  • Qualche raccomandazione per uno scenario di tie breaker? In questo momento è ordinato per tipo (quindi se un album ha più di un tipo di musica è valutato di più ma se tutti hanno lo stesso numero, non c'è più significativo)
  • -I ho creato il collegamento [: SIMILAR_TO] di far rispettare una priorità da considerare quel rapporto così importante, ma non ho avuto una cifra a lavorare con esso
  • -Stesso va per [: Popular_On] (? Forse cadere questo rapporto)

risposta

1

è possibile utilizzare 4 configurazioni e ordini di album in base al valore più alto in questo ordine. Mantenere configurazione tra 0 a 1 (es. 0,6)

a. People Popular on Chart and People are similar 
b. People Popular on Chart and People are Not similar 
c. People Not Popular on Chart and People are similar 
d. People Not Popular on Chart and People are Not similar 

Calcolare e sommare questi 4 valori con ogni album. Più alto è il valore, più alto è l'Album consigliato.

Ho configurato temporaneamente come a = 1, b = 0.8, c = 0.6, d = 0.4. E ipotizzato qualche relazione presente che suggerisce un album People Mi piace. Se stai creando una logica basata solo su Chart, utilizza solo uno & b.

MATCH (me:People) 
where id(me) = 123 
MATCH (a:Album { id: 456 })-[:is_a_type_of]->(t:Type)<-[:is_a_type_of]-(recommend)  
OPTIONAL MATCH (recommend)<-[:ARTIST_OF]-(a:People)-[:POPULAR_ON]->(:Chart) 
WHERE exists((me)-[:SIMILAR_TO]->(a)) 
OPTIONAL MATCH (recommend)<-[:ARTIST_OF]-(b:People)-[:POPULAR_ON]->(:Chart) 
WHERE NOT exists((me)-[:SIMILAR_TO]->(b)) 
OPTIONAL MATCH (recommend)<-[:LIKES]-(c:People) 
WHERE exists((me)-[:SIMILAR_TO]->(a)) 
OPTIONAL MATCH (recommend)<-[:LIKES]-(d:People) 
WHERE NOT exists((me)-[:SIMILAR_TO]->(a)) 
RETURN recommend, (count(a)*1 + count(b)*0.8 + count(c)* 0.6+count(d)*0.4) as rec_order 
ORDER BY rec_order DESC 
LIMIT 10; 
+0

Capisco la tua logica, ma non capisco anche cosa intendi per configurazione e calcoli + somma in riferimento alla tipologia di grafico. si prega di elaborare utilizzando pseudo-cyphers in caso di necessità di – azngunit81

+0

@ azngunit81: risposta aggiornata con query. –

+0

Due domande: 1) cosa intendi con Config..è questo peso? 2) La gente non significa te. Le persone significano Artisti, produttori, compositori, ecc ... (come spiegato nella mia domanda) – azngunit81