小编sav*_*ent的帖子

使用cypher将节点插入neo4j数据库的最有效方法是什么

我试图通过使用py2neo python模块(py2neo.cypher.execute)执行cypher命令,将大量节点(~500,000)插入到(非嵌入式)neo4j数据库中.最终我需要消除对py2neo的依赖,但我现在正在使用它,直到我了解更多有关cypher和neo4j的信息.

我有两个节点类型A和B,绝大多数节点都是A类型.有两种可能的关系r1和r2,例如A- [r1] -A和A- [r2] -B.类型A的每个节点将具有0-100个r1关系,并且类型B的每个节点将具有1-5000个r2关系.

目前,我通过构建大型CREATE语句来插入节点.例如,我可能有一个声明

CREATE (:A {uid:1, attr:5})-[:r1]-(:A {uid:2, attr:5})-[:r1]-...
Run Code Online (Sandbox Code Playgroud)

其中......可能是另外5000个左右的节点和关系,在图中形成一个线性链.这没关系,但它很慢.我也在使用这些节点索引

CREATE INDEX ON :A(uid)
Run Code Online (Sandbox Code Playgroud)

在我添加所有类型A节点后,我再次使用CREATE语句添加类型B节点.最后,我试图使用类似的语句添加r2关系

MATCH c:B, m:A where c.uid=1 AND (m.uid=2 OR m.uid=5 OR ...)
CREATE (m)-[:r2]->(c)
Run Code Online (Sandbox Code Playgroud)

其中......可以代表几千个OR语句.这似乎很慢,每秒只添加几个关系.

那么,有更好的方法吗?我完全偏离了这里吗?我看了这个问题,但这并没有解释如何使用cypher有效地加载节点.我看到的其他所有东西似乎都使用java,而不显示可以使用的实际密码查询.

python neo4j cypher

6
推荐指数
1
解决办法
1403
查看次数

如何在python中使用[]作为命名函数参数的默认值?

可能重复:
Python中的"最小惊讶":可变默认参数

我有这个代码

class Test(object):
  def __init__(self, var1=[]):
    self._var1 = var1

t1 = Test()
t2 = Test()

t1._var1.append([1])

print t2._var1
Run Code Online (Sandbox Code Playgroud)

我得到"[[1]]"作为结果.很明显,t1._var1和t2._var1正在寻址相同的列表.如果我放

t3 = Test()
print t3._var1
Run Code Online (Sandbox Code Playgroud)

然后我也得到"[[1]]".所以var1 = []似乎永久地将var1绑定到某个列表.我试着复制清单,

def __init__(self, var1=copy([])):
Run Code Online (Sandbox Code Playgroud)

但是得到了相同的结果,因此在调用init之前,似乎会计算命名参数的表达式,并且它只给var1一个空列表的副本,然后在实例之间共享.

那么如何使用[]作为命名参数的默认值?

python constructor named-parameters

3
推荐指数
1
解决办法
105
查看次数

标签 统计

python ×2

constructor ×1

cypher ×1

named-parameters ×1

neo4j ×1