What you are looking for, mathematically speaking, is a simplified Jaccard index between two users. That is, how similar they are, they are based on how much they have in common. I am talking about simplified, because we do not take into account films in which they do not agree. Essentially, and after your order it will be:
1) Get the total weight of each attribute for each user. For instance:
MATCH (user:User{name:'user1'}) OPTIONAL MATCH (user)-[r:RATED]->(m:Movie)->[w:WEIGHT]->(a:Attribute) WITH user, r.rating * w.weight AS totalWeight, a WITH user, a, sum(totalWeight) AS totalWeight
We need the last line, because we had a line for each Movie-Attribute combination
2) Then we get users with similar tastes. This is a hazardous performance area, some filtering may be required. But, roughly forcing it, we get users who like every attribute within a 10% error (for example)
WITH user, a, totalWeight*0.9 AS minimum, totalWeight*1.10 AS maximum MATCH (a)<-[w:WEIGHT]-(m:Movie)<-[r:RATES]-(otherUser:User) WITH user, a, otherUser WHERE w.weight * r.rating > minimum AND w.weight * r.rating < maximum WITH user, otherUser
So now we have a line (the only one due to the last line) with any other User, which is a match. Here, to be honest, I will need to make sure that if other users with the same genre match are involved .. if they are, an additional filter will be required. But I think this should happen after we do this.
3) Now it's easy:
MATCH (otherUser)-[r:RATES]->(m:Movie) WHERE NOT (user)-[:RATES]->(m) RETURN m, sum(r.rating) AS totalRating ORDER BY totalRating DESC
As mentioned earlier, the hard part is 2), but after we know how to get the math, it should be simpler. Oh, and about mathematics, for it to work correctly, the total weight for the film was to add 1 ( normalization ). In any other case, the difference between the total weight for films can lead to an unfair comparison.
I wrote this without proper study (paper, pencil, equations, statistics) and tried the code in a sample dataset. Hope this helps you anyway!
If you need this recommendation without taking into account user ratings or attribute weights, it should be enough to substitute the math in the lines in paragraphs 1) and 2) using only r.rating or w.weight respectively. The RATES and WEIGHTS ratios will continue to be used, so, for example, a movie for adventure movie users will be recommended to their favorite Adventure movie consumers, but not changed by ratings or attribute weights, as we have chosen.
EDIT: Code edited to correct syntax errors discussed in the comments.