在 neo4j 查询中的 ON MATCH SET 之前参考 属性 的当前值
Reference current value of property before ON MATCH SET within neo4j query
对于我正在构建的应用程序,用户可以在每次 phone 通话后互相评分(类似于 Whatsapp)。对于我正在实施的算法,应该更新用户 A 的平均评分,使其等于所有其他用户对用户 A 的平均评分的平均值。例如,如果有 3 个用户并且用户 B 和用户 C 都对用户进行了评分A,那么我要计算用户A的平均评分如下:
((User B's average rating of User A) + (User C's average rating of User A)) / 2
这是我的查询:
MATCH (u1:User { userId: $userId })-[r1:PARTICIPANT]-(c:Chat { roomId: $roomId })-[r2:PARTICIPANT]-(u2:User)
WHERE (r1.participantDuration > 0) AND (r2.participantDuration > 0)
SET r1.rating = $rating
MERGE (u1)-[r3:REVIEW]->(u2)
ON CREATE SET
r3.ratingCount = 1,
r3.averageRating = $rating,
u2.averageRating = ((u2.averageRating * u2.uniqueRatingCount) + $rating) / (u2.uniqueRatingCount + 1),
u2.uniqueRatingCount = u2.uniqueRatingCount + 1
ON MATCH WITH r3.averageRating AS oldAverage, r3.ratingCount AS oldCount SET
r3.averageRating = ((oldAverage * oldCount) + $rating) / (oldCount + 1),
r3.ratingCount = oldCount + 1,
u2.averageRating = u2.averageRating + ((r3.averageRating - oldAverage) / u2.uniqueRatingCount)
RETURN u2 { .averageRating }
我在执行 ON MATCH SET
之前捕获 averageRating 和 ratingCount 的先前状态时遇到问题。我想我收到一个错误,因为 neo4j 不允许在 ON MATCH
.
之后使用 WITH
子句
此外,是否有更好的方法来处理此查询,该方法可能性能更高并且可读性更好?
您可以通过引用旧值来使用它们
MATCH (u1:User { userId: $userId })-[r1:PARTICIPANT]-(c:Chat { roomId: $roomId })-[r2:PARTICIPANT]-(u2:User)
WHERE (r1.participantDuration > 0) AND (r2.participantDuration > 0)
SET r1.rating = $rating
MERGE (u1)-[r3:REVIEW]->(u2)
ON CREATE SET
r3.ratingCount = 1,
r3.averageRating = $rating,
u2.averageRating = ((u2.averageRating * u2.uniqueRatingCount) + $rating) / (u2.uniqueRatingCount + 1),
u2.uniqueRatingCount = u2.uniqueRatingCount + 1
ON MATCH SET
r3.averageRating = ((r3.averageRating * r3.ratingCount) + $rating) / ( r3.ratingCount + 1),
r3.ratingCount = oldCount + 1,
u2.averageRating = u2.averageRating + ((r3.averageRating - r3.averageRating) / u2.uniqueRatingCount)
RETURN u2 { .averageRating }
对于我正在构建的应用程序,用户可以在每次 phone 通话后互相评分(类似于 Whatsapp)。对于我正在实施的算法,应该更新用户 A 的平均评分,使其等于所有其他用户对用户 A 的平均评分的平均值。例如,如果有 3 个用户并且用户 B 和用户 C 都对用户进行了评分A,那么我要计算用户A的平均评分如下:
((User B's average rating of User A) + (User C's average rating of User A)) / 2
这是我的查询:
MATCH (u1:User { userId: $userId })-[r1:PARTICIPANT]-(c:Chat { roomId: $roomId })-[r2:PARTICIPANT]-(u2:User)
WHERE (r1.participantDuration > 0) AND (r2.participantDuration > 0)
SET r1.rating = $rating
MERGE (u1)-[r3:REVIEW]->(u2)
ON CREATE SET
r3.ratingCount = 1,
r3.averageRating = $rating,
u2.averageRating = ((u2.averageRating * u2.uniqueRatingCount) + $rating) / (u2.uniqueRatingCount + 1),
u2.uniqueRatingCount = u2.uniqueRatingCount + 1
ON MATCH WITH r3.averageRating AS oldAverage, r3.ratingCount AS oldCount SET
r3.averageRating = ((oldAverage * oldCount) + $rating) / (oldCount + 1),
r3.ratingCount = oldCount + 1,
u2.averageRating = u2.averageRating + ((r3.averageRating - oldAverage) / u2.uniqueRatingCount)
RETURN u2 { .averageRating }
我在执行 ON MATCH SET
之前捕获 averageRating 和 ratingCount 的先前状态时遇到问题。我想我收到一个错误,因为 neo4j 不允许在 ON MATCH
.
WITH
子句
此外,是否有更好的方法来处理此查询,该方法可能性能更高并且可读性更好?
您可以通过引用旧值来使用它们
MATCH (u1:User { userId: $userId })-[r1:PARTICIPANT]-(c:Chat { roomId: $roomId })-[r2:PARTICIPANT]-(u2:User)
WHERE (r1.participantDuration > 0) AND (r2.participantDuration > 0)
SET r1.rating = $rating
MERGE (u1)-[r3:REVIEW]->(u2)
ON CREATE SET
r3.ratingCount = 1,
r3.averageRating = $rating,
u2.averageRating = ((u2.averageRating * u2.uniqueRatingCount) + $rating) / (u2.uniqueRatingCount + 1),
u2.uniqueRatingCount = u2.uniqueRatingCount + 1
ON MATCH SET
r3.averageRating = ((r3.averageRating * r3.ratingCount) + $rating) / ( r3.ratingCount + 1),
r3.ratingCount = oldCount + 1,
u2.averageRating = u2.averageRating + ((r3.averageRating - r3.averageRating) / u2.uniqueRatingCount)
RETURN u2 { .averageRating }