【发布时间】:2014-03-18 17:21:21
【问题描述】:
我有连接到内容节点的术语节点,并且一个查询意味着更新内容节点到这些术语节点的连接。
首先,我减少最初附加的每个术语节点的连接内容节点的数量,然后删除关系。
之后,我创建了与所有指定术语节点的新关系,尝试将每个新连接的术语节点的连接内容节点数增加一个。
问题是,在查询运行后,连接的内容节点的计数并没有增加一,而是增加了看起来像正在连接的新术语节点的总数。
我似乎仍然无法准确掌握查询背后的数据处理方式。我怀疑答案可能涉及对连接的节点进行计数,就像我之前遇到的情况一样。
这里是查询:
var query = [
"MATCH (contentNode:content {UUID: {contentID} })-[r:TAGGED_WITH]->(oldTermNode:term) ",
"SET oldTermNode.contentConnections = oldTermNode.contentConnections - 1 ",
"DELETE r ",
"WITH contentNode ",
"MATCH (newTermNode:term) ",
"WHERE newTermNode.UUID IN {termIDs} ",
"CREATE UNIQUE contentNode-[:TAGGED_WITH]->newTermNode ",
"SET newTermNode.contentConnections = newTermNode.contentConnections + 1 ",
].join('\n');
作为一个附带问题,在更新术语时,许多新术语通常与旧术语相同(用户只添加/删除一两个术语,其余的保持不变)。如果仅删除不会重新连接的关系然后仅添加新术语,是否会更有意义/具有更快的性能?
非常感谢。
【问题讨论】:
-
您能否分析您的查询并发布执行计划? here's how 我认为您的计数变得不稳定的原因是您在
WITH有多个结果项,因此查询的第二部分被执行了多次。 -
没错。您的基数是错误的,它是您的第一个 MATCH 生成的路径数,因此第一个匹配后的所有内容都会为每个匹配的路径执行。如果您使用
WITH distinct contentNode,您会将该基数折叠回一 (1) 并丢弃所有其他路径。
标签: database graph neo4j cypher