我希望能够使用argparse.ArgumentParser对象中的全局选项来覆盖/扩充子命令的默认值.
一个例子是显示的帮助反映了全局更新,即以下玩具示例:
import argparse
import os
import sys
# Global parser and options.
parser = argparse.ArgumentParser(
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
parser.add_argument("--user",
dest="user",
default=os.environ.get("USER"),
help="Override the setting of the $USER variable.")
# Sub-command parser and options.
subparsers = parser.add_subparsers()
command = subparsers.add_parser(
"command",
formatter_class=argparse.ArgumentDefaultsHelpFormatter)
command.add_argument("--config",
dest="config",
default="~%s/config" % os.environ.get("USER"),
help="The config file.")
options = parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
理想情况下,当我在帮助模式下运行时,我会得到,
> python example.py --user thing command --help
usage: example.py command [-h] [--config CONFIG]
optional arguments:
-h, --help show this help message and exit
--config CONFIG The config file. …Run Code Online (Sandbox Code Playgroud) 我正在努力在 Neo4j 中有效地批量更新关系属性。目标是更新大约 500,000 个关系(每个关系大约有 3 个属性),我将它们分成 1,000 个批次并在单个 Cypher 语句中处理,
UNWIND {rows} AS row
MATCH (s:Entity) WHERE s.uuid = row.source
MATCH (t:Entity) WHERE t.uuid = row.target
MATCH (s)-[r:CONSUMED]->(t)
SET r += row.properties
Run Code Online (Sandbox Code Playgroud)
但是,每批 1,000 个节点大约需要 60 秒。:Entity标签的UUID 属性上存在索引,即我以前运行过,
CREATE INDEX ON :Entity(uuid)
Run Code Online (Sandbox Code Playgroud)
这意味着根据查询计划匹配关系非常高效,
总共有 6 次 db 命中,查询执行时间约为 150 毫秒。我还在 UUID 属性上添加了唯一性约束,以确保每个匹配项仅返回一个元素,
CREATE CONSTRAINT ON (n:Entity) ASSERT n.uuid IS UNIQUE
Run Code Online (Sandbox Code Playgroud)
有谁知道我如何进一步调试以了解为什么 Neo4j 需要这么长时间来处理关系?
请注意,我正在使用类似的逻辑来更新节点,这些节点的速度要快几个数量级,这些节点具有更多与之关联的元数据。
作为参考,我使用的是 Neo4j 3.0.3、py2neo 和 Bolt。Python 代码块的形式为,
for chunk in chunker(relationships): # 1,000 relationships …Run Code Online (Sandbox Code Playgroud) 我遇到了一个问题,我在Cypher批量查询中强制使用索引,
UNWIND {rows} AS row
MATCH (s:Entity)
USING INDEX s:Entity(uuid)
WHERE s.uuid = row.source
MATCH (t:Entity)
USING INDEX t:Entity(uuid)
WHERE t.uuid = row.target
MATCH (s)-[r:CONSUMED]->(t)
DELETE r
Run Code Online (Sandbox Code Playgroud)
哪里row.source和哪row.target两个UUID字符串.问题是我得到了错误ERROR - Cannot use index hint in this context.
如果我将查询扩充为仅返回Neo4j UI中特定源和目标节点的关系,即
MATCH (s:Entity)
USING INDEX s:Entity(uuid)
WHERE s.uuid = '04bc79e1-a836-11e6-b841-22000bcec6a9'
MATCH (t:Entity)
USING INDEX t:Entity(uuid)
WHERE t.uuid = 'a245f46a-a837-11e6-b841-22000bcec6a9'
MATCH (s)-[r:CONSUMED]->(t)
RETURN r
Run Code Online (Sandbox Code Playgroud)
没有错误被抛出并且关系被返回,因此我有点困惑的问题是什么?