java - 创建/设置来自 Neo4j 中参数对象的属性

标签 java python neo4j

在查询中,我提供以下参数:

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/

相关文章:

Java 锁定数组内的元素

java - 通过 http 调用远程 .bat 文件

python - python 中的 Fredo 和数组更新

X 染色体祖先的 Neo4j 密码查询

java - 我设置 ListView 的方式有什么问题?

java - 标记 JTable 中的重复项

Neo4j 服务器与嵌入式模式

rest - Neo4J Rest API理解

java - java 中的电话号码

Python,tqdm : is there a way to print something between a progress bar and what is printed using tqdm. 写?