2015-11-04 73 views
0

我想要獲得使用餘弦相似性的電影建議。將屬性類型從字符串更改爲neo4j中的整數

Cypher支架查詢:

MATCH (p1:User)-[x:HAS_RATED]->(m:Movie)<-[y:HAS_RATED]-(p2:User) 
WITH SUM(x.rating * y.rating) AS xyDotProduct, 
     SQRT(REDUCE(xDot = 0.0, a IN COLLECT(x.rating) | xDot + a^2)) AS xLength, 
     SQRT(REDUCE(yDot = 0.0, b IN COLLECT(y.rating) | yDot + b^2)) AS yLength, 
     p1, p2 
MERGE (p1)-[s:SIMILARITY]-(p2) 
SET s.similarity = xyDotProduct/(xLength * yLength) 

它引發錯誤:

Don't know how to Multiply(x.rating,y.rating) `4` with `4` 

我認爲的Neo4j集收視率字符串而不是整型,所以我跑這個查詢 -

match (:User)-[r:HAS_RATED]->(:Movie) 
with r limit 100000 
set r.rating = toInt(r.rating) return r 

但即使在此更新之後,我也遇到了與以前相同的錯誤。

我知道,我可以添加toInt修改爲每個變量,但我怎麼繁衍在我的關係評級領域不這樣做,或者換句話說,我該如何設置等級爲整型?

+0

我認爲你的策略是正確的。減少查詢的複雜性我已經能夠複製這個問題,並通過'SET r.rating = toInt(r.rating)'來修復它。你確定你所有的評級屬性已被重置爲整數?你有多少關係在你的數據庫中?你的密碼使用「LIMIT 100000」 - 你有可能沒有捕捉到一些關係,所以仍然有字符串? – ceej

+0

我有100萬的關係。我認爲限制在單個請求上執行,所以數據庫不會用完堆內存,但最終會在整個圖上運行? – goelakash

+0

不會。它會限制結果,因此只能在匹配的100000上運行。您需要使用「SKIP 100000 LIMIT 100000」重新執行查詢,直到您匹配並因此重置所有評級屬性。 – ceej

回答

2

上面的評論幾乎是正確的。最好是添加一個條件,以跳過已經被轉換的關係:

match (:User)-[r:HAS_RATED]->(:Movie) 
where r.rating = toString(r.rating) // make sure we only work string ratings 
with r limit 100000 
set r.rating = toInt(r.rating) 
return count(r) 

您運行的聲明,直到返回的值是0 - 這意味着沒有進一步的關係來處理。

+1

良好的調用'where r.rating = toString(r.rating)'。 +1。我想你可能不打算有兩個'return'語句! – ceej

+0

批准您的建議更改 - 謝謝。 –

相關問題