Neo4j 仅在给定条件下在foreach中创建节点

Neo4j 仅在给定条件下在foreach中创建节点,neo4j,Neo4j,出于版本控制的目的,我希望在数据库中有VERSION节点。仅当文件节点的属性大小发生更改时,才应创建此节点及其关系。文件节点应始终包含大小的当前值。由于无法在foreach中使用MATCH和WHERE,如何使这样的场景工作?是否有类似于“If子句”的东西用于foreach MERGE (root:FOLDER {fullpath: {newRoot}.fullpath}) ON CREATE SET root={newRoot} FOR EACH (newFile IN {newFiles} |

出于版本控制的目的,我希望在数据库中有
VERSION
节点。仅当
文件
节点的属性
大小
发生更改时,才应创建此节点及其关系。
文件
节点应始终包含
大小
的当前值。由于无法在
foreach
中使用
MATCH
WHERE
,如何使这样的场景工作?是否有类似于“If子句”的东西用于foreach

MERGE (root:FOLDER {fullpath: {newRoot}.fullpath})
ON CREATE SET root={newRoot}
FOR EACH (newFile IN {newFiles} | 
     MERGE (file:FILE {fullpath:newFile.fullpath}) ON CREATE SET file.guid = newFile.guid 
     SET file.visited = 1
     MERGE (root)-[:CONTAINS]->(file) 
只有当
file.size!=newFile.size
(大小已更改)

我希望你理解我想要实现的目标。如果有更好的节点版本控制解决方案,请给出建议。

fadanner

这是我发现的。这在我之前给你的答案中也适用(而不是FOREACH)

MERGE(根目录:文件夹{fullpath:{newRoot}.fullpath})
在创建集合根时={newRoot}
使用根展开{newFiles}作为新文件
合并(文件:文件{fullpath:newFile.fullpath})
创建时设置file.guid=newFile.guid
设置file.visted=1
合并(根)-[:包含]->(文件)
用文件,新文件
其中file.size newFile.size
创建(文件)-[:HASVERSION{v:1}]->(v:VERSION{size:newFile.size})
这比我测试的简单示例更复杂,因此可能存在错误。但是看看这样的事情能否解决你的问题

恩典与和平


吉姆

你就是那个人!这正是我想要的,我认为这是一个非常明确的解决方案。感谢您提供了这个伟大的解决方案。
    SET file.size = newFile.size 
    CREATE (file)-[:HASVERSION{v:1}]->(v:VERSION {size:newFile.size})
MERGE (root:FOLDER {fullpath: {newRoot}.fullpath})
ON CREATE SET root={newRoot}
WITH root UNWIND {newFiles} AS newFile
MERGE (file:FILE {fullpath : newFile.fullpath})
ON CREATE SET file.guid = newFile.guid
SET file.visited = 1
MERGE (root)-[:CONTAINS]->(file)
WITH file, newFile
WHERE file.size <> newFile.size
CREATE (file)-[:HASVERSION {v : 1}]->(v:VERSION {size : newFile.size})