2016-05-14 80 views
0

之間沒有直接的關係,我有這3個節點(用戶,鳴叫,令牌),如:屬性從Neo4j的一個csvfile加入的關係時,有節點

:User with this property {userID} 
:Token with this property {word} 
:Tweet with this properties {tweetID, userID, tweetTxt} 

,目前的關係如下:

(:Tweet)<-[:MADE]-(:User) (:Token)<-[:CONTAINS {tweet_score}]-(:Tweet)

現在考慮下面的CSV文件:

userToken.csv 
_________________________________________ 
token,userID,score 
that_danielle,15990804,0.111140564157 
foodies,15990804,0.159946268074 
soft-launched,15990804,0.132826927255 
email,60730027,0.0561669544423 
email,60730027,0.105124263028 
email,60730027,0.0453705868273 
email,60730027,0.0967876752689 
email,32785000,0.101566813224 
you,60730027,0.0835723672219 

我需要爲「CONTAINS」關係添加一個名爲「user_score」的新屬性,並應從userToken.csv文件中檢索此分數。在下面的代碼中,我試圖這樣做:匹配「p」以包含用戶擁有的所有Token節點(不知道這是否真的起作用!),然後用這些「p」從csv中添加「user_score」文件以 「包含」 關係:

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM "file:///..../userToken.csv" AS csvrow 
MATCH p=(u:User)-[*2]->(tok:Token) 
with p 
where u.userID = toInt(csvrow.userID) 
FOREACH (n IN nodes(p)| SET n.user_score = toFloat(csvrow.score)) 

Here is how my nodes and relations look like!!!

這將返回一個錯誤:

"csvrow not defined (line 6, column 52 (offset: 258)) 
"FOREACH (n IN nodes(p)| SET n.user_score = toFloat(csvrow.score))"" 

能否請你幫我解決這個問題?

PS:不知道我的問題的標題:未在WITH通過/

回答

0
USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM "file:///..../userToken.csv" AS csvrow 
MATCH p=(u:User)-[*2]->(tok:Token) 
with p 
where u.userID = toInt(csvrow.userID) 
FOREACH (n IN nodes(p)| SET n.user_score = toFloat(csvrow.score)) 

一切是不是以後就用,所以你不及格csvrow它已不再是束縛到查詢的其餘部分。

但是,你絕對不需要在這裏。其次,您的查詢會將分數添加到路徑中的所有節點,所以在用戶節點,推文和令牌上。

正如你希望把它放在CONTAINS關係,你可以做這樣的:

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM "file:///..../userToken.csv" AS csvrow 
MATCH (u:User) 
where u.userID = toInt(csvrow.userID) 
MATCH (u)-[:MADE]->(tweet)-[r:CONTAINS]->(token) 
SET r.user_score = csvrow.score 

這個查詢但是將評論後添加的user_score還能夠爲用戶節點

編輯(假設令牌節點上的性能關鍵是name

USING PERIODIC COMMIT 500 
LOAD CSV WITH HEADERS FROM "file:///..../userToken.csv" AS csvrow 
MATCH (u:User) 
where u.userID = toInt(csvrow.userID) 
MATCH (u)-[:MADE]->(tweet)-[r:CONTAINS]->(token) 
WHERE token.name = csvrow.token 
SET r.user_score = csvrow.score 
+0

感謝克里斯託弗,好一點forusing'WITH'然而,沒有任何疑問的了我是正確的結果。它找不到正確的:與用戶匹配的令牌。該場景如下:用戶創建一個':Tweet',這個':Tweet'是存儲在:Token(他們有:CONTAINS關係)中的一組單詞。現在我想從userToken.csv中添加'user_score',這意味着我爲每個在相關的':Tweet'中使用':Token'的':User'加權每個':Token'。這些查詢無法正確匹配':User'和':Token'。如果我只是可以在CSV文件中使用'tweetId',那將是一件非常容易的事情。 – Birish

+0

你不能過濾令牌嗎?我編輯了 –

+0

它工作了!最後一個查詢的劑量是我需要的。而你對'name'鍵的假設是正確的。謝謝Christophe! – Birish

相關問題