【问题标题】:How to Create Nodes in RNeo4j using Vectors or Dataframes如何使用向量或数据帧在 RNeo4j 中创建节点
【发布时间】:2014-09-12 07:16:38
【问题描述】:

借助包/驱动程序RNeo4j (https://github.com/nicolewhite/Rneo4j),可以在R 中使用流行的图形数据库Neo4j

包作者@NicoleWhiteGitHub上提供了severalgreat examples的用法。

不幸的是,@NicoleWhite 给出的示例和文档有点过于简单,因为它们手动创建了每个图形节点及其关联的labelsproperties,例如:

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

【问题讨论】:

  • 为什么要使用 paste 函数为 df$user_id[i] 赋值?

标签: r neo4j graph-databases r-neo4j


【解决方案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。

【讨论】:

  • 这对我的问题非常有用,谢谢!
  • 我宁愿在 RNeo4j 中使用 LOAD CSV 之前使用 write.csv() 而不是在你的 Neo4j shell 中的原因是,按照你的方式做这将需要我离开 RStudio。即使对于像这样简单的事情,不得不离开我的 IDE 对我的工作流程来说也是一个不小的干扰,并使自动化变得更加困难。这就是为什么你的 RNeo4j 包很棒。
  • 这仍然是最佳实践@nicole-white 吗?
  • 如果有一个块添加版本来加速它会很好。每秒几百行非常慢。
猜你喜欢
  • 2023-03-13
  • 2021-09-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-26
  • 2020-08-12
  • 2021-10-25
  • 1970-01-01
  • 2018-02-11
相关资源
最近更新 更多