簡體   English   中英

R對neo4j的多次提交

[英]Multiple commits to neo4j from R

我已經使用twitteR軟件包收集了一些推文,然后使用Nicole White的各種教程將它們導出到neo4j數據庫中。 我將這些推文提取到一個稱為kdf的數據幀中,然后使用stringr函數進行基本清理,如Nicole所示。 然后,我將其從R發送到neo4j。我的代碼的基本部分是:

library(RNeo4j)
graph = startGraph("http://localhost:7474/db/data/", username="xxxx", password="xxxx")
clear(graph)

addConstraint(graph, "Tweet", "id")
addConstraint(graph, "User", "username")
addConstraint(graph, "Hashtag", "hashtag")
addConstraint(graph, "Tags", "ent_tag")


query = "
CREATE (tweet:Tweet {id: {tweetID}})
SET tweet.text = {text}

CREATE (user:User {name: {Username}})

CREATE (user)-[:TWEETED]->(tweet)
FOREACH(reply_to_sn IN CASE {reply_to_sn} WHEN NULL then [] else [{reply_to_sn}] END | 
MERGE (replytouser:User {username:{reply_to_sn}})
CREATE (tweet)-[:IN_REPLY_TO]->(replytouser)
)

FOREACH(retweet_sn IN CASE {retweet_sn} WHEN NULL THEN [] ELSE [{retweet_sn}] END |
MERGE(retweet_user:User {username: {retweet_sn}})
CREATE (tweet)-[:RETWEET_OF]->(retweet_user)
)

FOREACH(hastag_nodes IN CASE {hashtag_nodes} WHEN NULL then [] else [{hashtag_nodes}] END |
MERGE (h:Hashtag {hashtag :{hashtag_nodes}})
CREATE (tweet)-[:HASHTAG]->(h)
)

FOREACH(mentioned_users IN CASE {mentioned_users} WHEN NULL then [] else [{mentioned_users}] END |
MERGE (m:User {username :{mentioned_users}})
CREATE (tweet)-[:MENTIONED]->(m)
)

"
tx = newTransaction(graph)

for(i in 1:nrow(kdf)){
  row = kdf[i, ]
  appendCypher(tx, query,
               tweetID=row$id,
               text=row$text,
               Username=row$screenName,
               reply_to_sn=row$replyToSN,
               retweet_sn=getRetweetSN(row$text),
               hashtag_nodes=getHashtags(row$text),
               mentioned_users=getMentions(row$text))

}
commit(tx)

之后,我使用Watson的Alchemy API為所有文本提取了命名實體。 這存儲在稱為ent_tbl的數據幀中。 它包含三個變量, tweetidetextetype 現在,我也嘗試將數據導出到相同的neo4j數據庫,並加入推文的ID。 這是代碼的另一部分:

query="
MATCH(t:ent_tag {id : $twid, type :$etype, text :$etext}) 
MATCH(tw:tweet {tweetID : $twid }) 
CREATE (tw)-[:HAS_ENT]->(t) 
"
tx=newTransaction(graph)
for (i in 1:nrow(ent_tbl)){
  row = ent_tbl[i,]
  appendCypher(tx, query,
               twid=row2$tweetid,
               etype=row2$etype,
               etext=row2$etext)
}



commit(tx)

雖然提交該操作沒有任何錯誤,但是summary(graph)並沒有顯示我期望看到的標簽( t )和推文( tw )之間的關系。

> summary(graph)
   This          To    That
1  User     TWEETED   Tweet
2 Tweet  RETWEET_OF    User
3 Tweet     HASHTAG Hashtag
4 Tweet   MENTIONED    User
5 Tweet IN_REPLY_TO    User 

為什么會這樣? 這是我在neo4j中的db.schema:

數據庫模式

那是因為MATCH沒有找到任何標簽或推文,所以它中斷了。 如果要向現有節點添加數據,則應按ID匹配它們,然后設置其屬性。 而且您必須與標簽和大小寫一致。 我認為這就是您想要的。

query="
MATCH(t:Tags {ent_tag : $twid}) 
MATCH(tw:Tweet {tweetID : $twid })
SET t.type=$etype, t.text=$etext
CREATE (tw)-[:HAS_ENT]->(t) 
"
tx=newTransaction(graph)
for (i in 1:nrow(ent_tbl)){
  row = ent_tbl[i,]
  appendCypher(tx, query,
           twid=row2$tweetid,
           etype=row2$etype,
           etext=row2$etext)
}



commit(tx)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM