从 R 多次提交到 neo4j

Multiple commits to neo4j from R

提问人:Dhiraj 提问时间:3/21/2017 最后编辑:Dhiraj 更新时间:3/22/2017 访问量:69

问:

我使用该软件包收集了一些推文,然后使用 Nicole White 的各种教程将它们导出到 neo4j 数据库。我将推文提取到一个名为 DataFrame 的数据帧中,然后使用函数进行基本清理,如 Nicole 所示。然后,我将它从 R 发送到 neo4j。我的代码的基本部分是:twitteRkdfstringr

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 提取所有文本的命名实体。它存储在名为 的数据帧中。它包含三个变量 , 和 。现在我也尝试将这些数据导出到同一个 neo4j 数据库并加入推文的 ID。这是代码的另一部分:ent_tbltweetidetextetype

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)ttw

> 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:

db.schema

R-NEO4J

评论


答:

2赞 Tomaž Bratanič 3/21/2017 #1

那是因为找不到任何标签或推文,所以它中断了。如果要向现有节点添加数据,则应按 ID 匹配它们,然后设置其属性。而且你必须与标签和大写/小写保持一致。我想这就是你要找的。MATCH

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)

评论

0赞 Dhiraj 3/21/2017
谢谢你的回答,Tomaz,但结果是一样的。没有关系。
0赞 Tomaž Bratanič 3/21/2017
我已经更改了,因为我注意到您使用ent_tag来查找正确的标签MATCH (:Tags)
0赞 Dhiraj 3/21/2017
我不确定我是否完全遵循。我注意到的是,Tags 节点上的约束是CONSTRAINT ON ( tags:Tags ) ASSERT tags.ent_tag IS UNIQUE
0赞 Tomaž Bratanič 3/21/2017
:Tags是节点的标签,而 是节点的唯一属性,就像一个人的名字。匹配现有节点时,应始终仅按该唯一属性进行匹配/合并,然后设置新属性和/或创建新关系ent_tag
0赞 Dhiraj 3/21/2017
理解。但我仍然没有得到任何:)我是否应该尝试通过将第二个数据帧转换为 csv 然后加载 CSV 来添加它?