2013-12-09 5 views
6

Ho un grafico dei membri e degli articoli che hanno guardato.Confronto dei valori degli array con cypher/neo4j

Questi dati verranno utilizzati per consigliare gli articoli in base agli articoli visualizzati da membri simili. Mi piacerebbe ordinare gli oggetti in base alla somiglianza dei colori degli articoli. I colori sono memorizzati sugli elementi di un array (["rosso", "blu", "verde"]). C'è un modo in Cypher per confrontare gli array per vedere quanti elementi hanno in comune?

risposta

8

Dati due nodi, n e m, che sembrano qualcosa come:

CREATE ({id: 1, color: ["red", "blue", "green", "yellow"]}) 
CREATE ({id: 2, color: ["red", "blue", "green", "white"]}) 

Si può fare qualcosa di simile:

MATCH n, m 
WHERE n.id = 1 AND m.id = 2 
RETURN length(FILTER(x in n.color WHERE x in m.color)) 

I FILTER itera funzione attraverso l'array n.color, vincolante il valore corrente a x (scelto arbitrariamente da me, potrebbe essere diverso). Il predicato (x in m.color) viene controllato per ogni valore x e, se viene valutato true, tale elemento viene inserito nel nuovo array restituito da FILTER. Puoi lasciarlo a quello per vedere l'intersezione dei due array (rosso, blu e verde in questo caso), o avvolgerlo nella funzione length per vedere il numero di colori condivisi tra i due nodi (3 in questo caso) .

Scopri i documenti FILTER completo qui: http://docs.neo4j.org/chunked/milestone/query-functions-collection.html#functions-filter

+1

+1 per buona risposta con la spiegazione, ma (dato risposta presuppone versione 2.0, potrebbe anche) utilizzare la corrispondenza con le proprietà: 'match (n {id: 1}) 'et cetera. – jjaderberg

+0

Ah sì. Sto usando una versione milestone di 2.0 (M06) che non supporta quella sintassi, ma una buona chiamata. –

+0

hai menzionato 'length' alla fine, ma il' count' nella query non ha molto senso - restituirà solo il numero di risultati. –