提问人:Hack-R 提问时间:8/14/2014 最后编辑:CommunityHack-R 更新时间:9/12/2014 访问量:2351
如何使用向量或数据帧在 RNeo4j 中创建节点
How to Create Nodes in RNeo4j using Vectors or Dataframes
问:
由于软件包/驱动程序(https://github.com/nicolewhite/Rneo4j),流行的图形数据库可以在其中使用。Neo4j
R
RNeo4j
包作者 @NicoleWhite 在 GitHub 上提供了几个很好的使用示例。
不幸的是,@NicoleWhite 和文档给出的示例有点过于简单,因为它们手动创建了每个图形节点及其关联的 和 ,例如:labels
properties
mugshots = createNode(graph, "Bar", name = "Mugshots", location = "Downtown")
parlor = createNode(graph, "Bar", name = "The Parlor", location = "Hyde Park")
nicole = createNode(graph, name = "Nicole", status = "Student")
addLabel(nicole, "Person")
当你处理一个很小的示例数据集时,这一切都很好,但对于像有数千个用户的大型社交图这样的东西,这种方法是不可行的,其中每个用户都是一个节点(这样的图可能不会在每个查询中利用每个节点,但它们仍然需要输入到)。Neo4j
我正在尝试弄清楚如何使用矢量或数据帧来做到这一点。有没有解决方案,也许是调用语句或循环?apply
for
此基本尝试:
for (i in 1:length(df$user_id)){
paste(df$user_id[i]) = createNode(graph, "user", name = df$name[i], email = df$email[i])
}
导致Error: 400 Bad Request
答:
12赞
Nicole White
8/14/2014
#1
第一次尝试时,您应该查看我刚刚为事务终结点添加的功能:
http://nicolewhite.github.io/RNeo4j/docs/transactions.html
library(RNeo4j)
graph = startGraph("http://localhost:7474/db/data/")
clear(graph)
data = data.frame(Origin = c("SFO", "AUS", "MCI"),
FlightNum = c(1, 2, 3),
Destination = c("PDX", "MCI", "LGA"))
query = "
MERGE (origin:Airport {name:{origin_name}})
MERGE (destination:Airport {name:{dest_name}})
CREATE (origin)<-[:ORIGIN]-(:Flight {number:{flight_num}})-[:DESTINATION]->(destination)
"
t = newTransaction(graph)
for (i in 1:nrow(data)) {
origin_name = data[i, ]$Origin
dest_name = data[i, ]$Dest
flight_num = data[i, ]$FlightNum
appendCypher(t,
query,
origin_name = origin_name,
dest_name = dest_name,
flight_num = flight_num)
}
commit(t)
cypher(graph, "MATCH (o:Airport)<-[:ORIGIN]-(f:Flight)-[:DESTINATION]->(d:Airport)
RETURN o.name, f.number, d.name")
在这里,我形成一个 Cypher 查询,然后遍历一个数据帧并将值作为参数传递给 Cypher 查询。您现在的尝试会很慢,因为您正在为创建的每个节点发送单独的 HTTP 请求。通过使用事务终结点,可以在单个事务下创建多个内容。如果您的数据框非常大,我会将其拆分为每笔交易大约 1000 行。
作为第二次尝试,您应该考虑在 neo4j-shell 中使用 LOAD CSV。
评论
0赞
Hack-R
8/14/2014
这是解决我问题的非常有用的解决方案,谢谢!
2赞
Hack-R
8/15/2014
我更喜欢在 RNeo4j 中使用 LOAD CSV 的原因是,在 write.csv( 之前,而不是在您的 Neo4j shell 中使用 LOAD CSV,因为按照自己的方式操作需要我离开 RStudio。即使对于这样简单的事情,必须离开我的 IDE 也会对我的工作流程造成不小的干扰,并使自动化变得更加困难。这就是为什么你的RNeo4j软件包很棒。
0赞
geotheory
10/25/2017
这仍然是@nicole-white的最佳实践吗?
0赞
EngrStudent
12/4/2017
如果有一个块添加版本来加快速度,那就太好了。每秒几百行是相当慢的。
评论