Hac*_*k-R 8 r neo4j graph-databases r-neo4j
由于软件包/驱动程序(https://github.com/nicolewhite/Rneo4j),Neo4j可以使用流行的图形数据库.RRNeo4j
软件包作者@ 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")
Run Code Online (Sandbox Code Playgroud)
当你处理一个微小的示例数据集时,这一切都很好,但这种方法对于像数千个用户的大型社交图这样的东西是不可行的,其中每个用户都是一个节点(这样的图可能不会利用每个节点)每个查询,但仍然需要输入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])
}
Run Code Online (Sandbox Code Playgroud)
导致 Error: 400 Bad Request
Nic*_*ite 12
作为第一次尝试,您应该查看我刚为事务端点添加的功能:
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")
Run Code Online (Sandbox Code Playgroud)
在这里,我形成一个Cypher查询,然后遍历数据帧并将值作为参数传递给Cypher查询.您现在的尝试将很慢,因为您正在为创建的每个节点发送单独的HTTP请求.通过使用事务端点,您可以在单个事务下创建多个内容.如果您的数据框非常大,我会将其分解为每个事务大约1000行.
作为第二次尝试,您应该考虑在neo4j-shell中使用LOAD CSV.