Database 为什么这个查询增加的计数比预期的要多?(cypher/neo4j)?
我有一个连接到内容节点的术语节点和一个表示更新内容节点到这些术语节点的连接的查询 首先,我为每个最初附加的术语节点减少连接内容节点的数量,然后删除关系 之后,我创建了一个与所有指定术语节点的新关系,尝试将每个新连接的术语节点的连接内容节点数增加一个 问题是,在查询运行后,连接的内容节点的数量不会增加1,而是增加了新连接的术语节点的总数 似乎我仍然难以准确掌握查询背后的数据处理方式。我怀疑答案可能是对连接的节点进行计数,就像之前我陷入困境时的情况一样 以下是查询:Database 为什么这个查询增加的计数比预期的要多?(cypher/neo4j)?,database,graph,neo4j,cypher,Database,Graph,Neo4j,Cypher,我有一个连接到内容节点的术语节点和一个表示更新内容节点到这些术语节点的连接的查询 首先,我为每个最初附加的术语节点减少连接内容节点的数量,然后删除关系 之后,我创建了一个与所有指定术语节点的新关系,尝试将每个新连接的术语节点的连接内容节点数增加一个 问题是,在查询运行后,连接的内容节点的数量不会增加1,而是增加了新连接的术语节点的总数 似乎我仍然难以准确掌握查询背后的数据处理方式。我怀疑答案可能是对连接的节点进行计数,就像之前我陷入困境时的情况一样 以下是查询: var query =
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');
作为一个附带问题,在更新术语时,通常许多新术语与旧术语相同(用户只添加/删除一个或两个术语,其余的保持不变)。如果只删除那些不会重新连接的关系,然后只添加新的术语,是否更有意义/性能更快
非常感谢。我已经修改了您的查询,使其能够按照您所描述的那样工作。我所做的是将术语收集到一个不同的集合中,并遍历每个节点以增加和减少它们的连接计数。这在理论上应该是可行的,但我建议采取其他预防措施,以保持术语节点上关系计数的一致性 但是我假设每个术语都有无限的连接,这在计算上是非常昂贵的,要对每个术语进行轮询,然后计算连接数,然后将其设置为节点上的权重
MATCH (contentNode:content {UUID: "1234" })-[r:TAGGED_WITH]->(oldTermNode:term)
WITH contentNode, collect(r) as oldRels, collect(DISTINCT oldTermNode) as oldTermNodes
FOREACH (oldTermNode in oldTermNodes |
SET oldTermNode.contentConnections = oldTermNode.contentConnections - 1)
FOREACH (r in oldRels | DELETE r)
WITH contentNode
MATCH (newTermNode:term)
WHERE newTermNode.UUID IN ["1112", "1113"]
CREATE UNIQUE (contentNode)-[:TAGGED_WITH]->(newTermNode)
WITH collect(DISTINCT newTermNode) as newTermNodes
FOREACH (newTermNode in newTermNodes |
SET newTermNode.contentConnections = newTermNode.contentConnections + 1)
您需要重新插入参数,我为实际测试构建了这个代码示例,以确保它工作正常
作为一个附带问题,在更新条款时,许多新的
术语与旧术语相同(用户仅添加/删除一个或多个术语)
两个任期,其余任期不变)。这更有意义吗
如果没有关系,性能会更快
是否删除了重新连接的,然后只添加了新的术语
可以通过指定只需要不在newTermNode集合中的oldTermNodes来修改查询。是的,为了回答您的问题,这将防止不必要的写入,从而提高性能。您只需确保从newTermNodes集合中删除任何冗余术语,以便在脚本的最后一行中不会增加这些术语的contentConnections。我已修改了您的查询,使其按照您所描述的方式工作。我所做的是将术语收集到一个不同的集合中,并遍历每个节点以增加和减少它们的连接计数。这在理论上应该是可行的,但我建议采取其他预防措施,以保持术语节点上关系计数的一致性 但是我假设每个术语都有无限的连接,这在计算上是非常昂贵的,要对每个术语进行轮询,然后计算连接数,然后将其设置为节点上的权重
MATCH (contentNode:content {UUID: "1234" })-[r:TAGGED_WITH]->(oldTermNode:term)
WITH contentNode, collect(r) as oldRels, collect(DISTINCT oldTermNode) as oldTermNodes
FOREACH (oldTermNode in oldTermNodes |
SET oldTermNode.contentConnections = oldTermNode.contentConnections - 1)
FOREACH (r in oldRels | DELETE r)
WITH contentNode
MATCH (newTermNode:term)
WHERE newTermNode.UUID IN ["1112", "1113"]
CREATE UNIQUE (contentNode)-[:TAGGED_WITH]->(newTermNode)
WITH collect(DISTINCT newTermNode) as newTermNodes
FOREACH (newTermNode in newTermNodes |
SET newTermNode.contentConnections = newTermNode.contentConnections + 1)
您需要重新插入参数,我为实际测试构建了这个代码示例,以确保它工作正常
作为一个附带问题,在更新条款时,许多新的
术语与旧术语相同(用户仅添加/删除一个或多个术语)
两个任期,其余任期不变)。这更有意义吗
如果没有关系,性能会更快
是否删除了重新连接的,然后只添加了新的术语
可以通过指定只需要不在newTermNode集合中的oldTermNodes来修改查询。是的,为了回答您的问题,这将防止不必要的写入,从而提高性能。您只需确保从newTermNodes集合中删除任何冗余术语,以便在脚本的最后一行中,这些术语的contentConnections不会增加。这并不能直接回答您的问题,但我想知道您的术语是否真的需要具有“contentConnections”属性。若并没有,那个么你们原来的问题就变得毫无意义了 仅根据您问题中的信息,term.contentConnections值似乎只是a:taged_WITH relationship指向该术语的次数的计数。如果是这种情况,那么您应该能够通过以下方式获得等效计数:
MATCH ()-[:TAGGED_WITH]->(t:term {UUID:{termId}}) RETURN count(t);
如果您为术语节点的UUID属性创建索引(或者更好的是,创建唯一性约束),那么这个查询将非常快。如果这对您有效,那么您可以简化和加速其他查询,因为不需要维护contentConnections值
例如,原始查询可以简化为:
var query = [
"MATCH (contentNode:content {UUID: {contentID} })-[r:TAGGED_WITH]->(oldTermNode:term) ",
"DELETE r ",
"WITH contentNode ",
"MATCH (newTermNode:term) ",
"WHERE newTermNode.UUID IN {termIDs} ",
"CREATE UNIQUE contentNode-[:TAGGED_WITH]->newTermNode ",
].join('\n');
这并不能直接回答您的问题,但我想知道您的术语是否真的需要有“contentConnections”属性。若并没有,那个么你们原来的问题就变得毫无意义了 仅根据您问题中的信息,term.contentConnections值似乎只是a:taged_WITH relationship指向该术语的次数的计数。如果是这种情况,那么您应该能够通过以下方式获得等效计数:
MATCH ()-[:TAGGED_WITH]->(t:term {UUID:{termId}}) RETURN count(t);
如果您为术语节点的UUID属性创建索引(或者更好的是,创建唯一性约束),那么这个查询将非常快。如果这对您有效,那么您可以简化和加速其他查询,因为不需要维护内容