我的Cypher声明是否“过度”

时间:2015-06-18 18:39:04

标签: neo4j py2neo

我正在使用py2neo进行交易。这意味着我使用的是Cypher语言。我将文本Cypher语句附加到事务队列并一次性提交队列内容。

工作正常。但是,它很慢。我每秒大约100个/节点,随着事务队列变大,插入需要更长的时间。如果一个事务有超过6,000个节点(以及相似数量的关系),我的应用程序就会超时。

现在我想专注于我的Cypher。我的应用程序产生了很多这个:

CREATE (n:METHOD {version: 6995, unique: 682, return_type: 0, fully_qualified_name: 0, name: "method4", accessibility: 0})
CREATE (n:PARAMETER {version: 6995, unique: 687, fully_qualified_name: 0, param_type: 1, name: "param4", accessibility: 0})
MATCH (a:METHOD), (b:PARAMETER) WHERE a.unique=682 AND a.version=6995 AND b.unique=687 AND b.version=6995 CREATE (a)-[r:INVOKED_WITH]->(b)

所以我创建一个METHOD节点,创建一个PARAMETER节点,然后将它们关联起来。困扰我的是我基本上创建了两个节点,然后扔掉了我刚创建它们的事实。然后我通过查找找到它们,以便我可以连接它们。这让我很烦。以前的版本没有使用交易;当我创建一个节点时,我得到了一个原生的neo4j ID,并在创建关系时使用它。现在我不能这样做,因为文本语句是集体提交给neo4j服务器的。

我是否可以按照neo4j web界面的方式将RETURN语句放在那里?是否有更好的Cypher使用?

编辑 - 我对所有相关节点类型的“唯一”属性都有索引。

我没有在Python代码中使用参数,因为代码使用的是事务。因此我必须使用py2neo的机制直接与neo4j交谈。这涉及创建您在上面看到的文本命令。

1 个答案:

答案 0 :(得分:4)

Py2neo支持事务,当然你可以在cypher查询中使用参数,这是我刚测试的一个简单代码:

from py2neo import Graph
import time

graph = Graph("http://neo4j:password@localhost:7474/db/data/");

tx = graph.cypher.begin()
for x in range(0,100):
    tx.append("CREATE (m:Method {id:{id}})", {"id": x})
    tx.append("CREATE (p:Parameter {id:{id}})", {"id": x})
    tx.append("MATCH (m:Method {id:{mid}}), (p:Parameter {id: {pid}}) CREATE (m)-[:RELATES]->(p)", {"mid": x, "pid": x})

mstart = int(round(time.time() * 1000))
tx.commit()
mend = int(round(time.time() * 1000))
diff = mend - mstart
print diff

差异时间约为80毫秒

更新,您也可以这样做:

    tx.append("CREATE (m:Method {id:{method_id}}) WITH m
               UNWIND {parameter_ids} as p_id 
               CREATE (p:Parameter {id:p_id})
               CREATE (m)-[:RELATES]->(p)", 
              {"method_id": 1234, "parameter_ids":range(0,100)})