我的 Cypher 语句是 'overdone'
Are my Cypher statements 'overdone'
我正在使用 py2neo 进行交易。这意味着我正在使用 Cypher 语言。我正在 append 将文本 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 网络界面中那样放置 RETURN 语句吗?有更好用的Cypher吗?
EDIT - 我在所有相关节点类型的 "unique" 属性 上都有索引。
我没有在我的 Python 代码中使用参数,因为该代码正在使用事务。因此我必须使用 py2neo 的机制直接与 neo4j 对话。这涉及创建您在上面看到的文本命令。
Py2neo 支持事务,当然你可以在密码查询中使用参数,我刚刚测试的一个简单代码:
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)})
我正在使用 py2neo 进行交易。这意味着我正在使用 Cypher 语言。我正在 append 将文本 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 网络界面中那样放置 RETURN 语句吗?有更好用的Cypher吗?
EDIT - 我在所有相关节点类型的 "unique" 属性 上都有索引。
我没有在我的 Python 代码中使用参数,因为该代码正在使用事务。因此我必须使用 py2neo 的机制直接与 neo4j 对话。这涉及创建您在上面看到的文本命令。
Py2neo 支持事务,当然你可以在密码查询中使用参数,我刚刚测试的一个简单代码:
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)})