在查询中,我提供以下参数:
id : 'some unique ID',
used : [an array of md5 checksums]
使用以下查询:
MATCH (a {id:{id}}) , (b)
WHERE b.md5 IN {used}
CREATE UNIQUE (a)-[]->(b)
一切都很棒。如果used
数组中有10个MD5校验和,则节点“a”将与它们建立10个关系。酷。
但现在假设我需要向该关系添加一个属性 - 该属性将取决于节点 b。
现在我有一个额外的参数,一个对象,如下所示:
info : {
'5fb1be1279031c1f1c65a928eb823e51': 'yolo',
'0aab9f8e81684ec778f8c0c5717f37c2': 'swag',
...
}
此对象中的 MD5 键与 used
数组中的 MD5 字符串匹配。
我的第一 react 是这样做:
MATCH (a {id:{id}}) , (b)
WHERE b.md5 IN {used}
CREATE UNIQUE (a)-[{ meme:{info}[b.md5] }]->(b)
因为那行不通。我收到错误:
{ [neo4j.ClientError: [Neo.ClientError.Statement.InvalidType] Expected e1701806eda7d3ab52b143cc03d94e75 to be a java.lang.Number, but it was a java.lang.String] message: '[Neo.ClientError.Statement.InvalidType] Expected e1701806eda7d3ab52b143cc03d94e75 to be a java.lang.Number, but it was a java.lang.String', neo4j: { code: 'Neo.ClientError.Statement.InvalidType', message: 'Expected e1701806eda7d3ab52b143cc03d94e75 to be a java.lang.Number, but it was a java.lang.String' }, name: 'neo4j.ClientError' }
如果有人可以提供帮助,我将非常感激,因为我完全陷入了困境:/
最佳答案
仔细阅读了Stefan的博客后,我发现我可以使用以下Cypher来实现我所需要的。 这并不漂亮,但除非有一种比 FOREACH/CASE 技巧更简单的有条件地创建东西的方法,否则它必须这样做:
首先将键/值对对象拆分为两个数组:
> fileMD5 : ['5fb1be1279031c1f1c65a928eb823e51','0aab9f8e81684ec778f8c0c5717f37c2'..]
> fileInfo : ['yolo','swag'...]
然后将表达式写成:
MATCH (e:event {id:{id}}),(r:resource)
WHERE r.md5 IN {used}
FOREACH(
idx in RANGE(0,SIZE({fileMD5})-1) |
FOREACH(
filePath IN CASE WHEN r.md5 = {fileMD5}[idx] THEN [{fileInfo}[idx]] ELSE [] END |
CREATE UNIQUE (r)-[:USED_BY {filePath:filePath }]->(e)
)
)
我8小时前写了这个问题,这意味着这几行字花了8个小时的时间才得到。我希望其他人发现它有用:P
编辑:关于它如何/为什么工作的一些解释......
第一个 FOREACH 迭代从 0 到(键或值数组的长度 -1)的 RANGE,结果为 idx 变量。这是同时迭代两个相同长度数组的常见技巧。
第二个 FOREACH 有点复杂。它迭代一个由 CASE 创建的数组,结果称为 filePath。然而,CASE 只返回一个其中没有任何内容的数组 [],或者一个包含我们想要在 CREATE 中设置的值的数组。因此,根据具体情况,FOREACH 要么执行一次操作,要么根本不执行任何操作。
这个案例非常简单。当索引提取出与我们想要的匹配的键 (r.md5 = {fileMD5}[idx]) 时,它会返回一个包含一个值的数组 - 值数组中的值使用与键数组中匹配的索引相同的索引.
关于java - 创建/设置来自 Neo4j 中参数对象的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31907543/