Neo4j - 有没有办法像 javascript 那样破坏 json 对象

Neo4j - is there a way to destruct json objects like in javascript

使用 nodejs 和 neo4j。我有节点标签:Product。它的属性之一是 entries:这是一个字符串化的 json,包含类型为 entry.

的嵌套对象

每当用户输入产品 link 时,输入的数量就会增加。

例如:从 Facebook 页面输入产品 link,应增加 facebookPage 条目的数量。

productIdentry 是路由到该查询的服务器端点的参数。) 当前查询:

MATCH (p:Product {id: $prodcutId})
WITH apoc.convert.fromJsonMap(p.entries).facebookPage AS jsonEntries, p
SET p.entries = apoc.convert.toJson({facebookPage: { link: jsonEntries.link, amount: jsonEntries.amount + 1}})
RETURN p as product

只有一个条目 (facebookPage),查询工作正常。

但是有多个(例如:instagramPage),我需要一种方法来保存以前的条目数据。

与 javascript 我会做这样的事情:

SET p.entries = apoc.convert.toJson({...jsonEntries, $entry: { link: jsonEntries.link, amount: jsonEntries.amount + 1, min: 1 }}})

有没有办法实现这种行为?

我看到了用于销毁 json 对象的 APOC 点符号。

link to the docs

在我的案例中使用它,它看起来像这样

MATCH (p:Product {id: 'b80a61ea4a40408f847214fa3ccf9067'})
WITH apoc.convert.fromJsonMap(l.entries) AS jsonEntries, l
SET l.entries = apoc.convert.toJson(jsonEntries{.instagramPage, facebookPage: { link: jsonEntries.facebookPage.link, amount: jsonEntries.amount + 1 }})
RETURN l as p

但这需要指定任何条目,这是不需要的。会有很多条目,这会使查询难以维护。此外,只要有新条目,查询就需要更新。

产品结构:

{
"entries": "{"facebookPage":{"amount":1,"link":"www.facebook.com"},"instagram":{"amount":1,"link":"www.IG.com"}}",
"id": "b80a61ea4a40408f847214fa3ccf9067",
"title": "Guitar"
  }
}

条目结构:

{
  amount: 0,
  link: 'some-link.com',
}

您正在使用的解构没有 APOC 功能,只有普通的 Neo4j。您可以使用 .* 选择器解构所有属性 - 请参阅 map projection documentation page.

上的最后一个示例

那么,我们会将 .instagramPage 替换为 .*:

MATCH (p:Product {id: 'b80a61ea4a40408f847214fa3ccf9067'})
WITH apoc.convert.fromJsonMap(l.entries) AS jsonEntries, l
SET l.entries = apoc.convert.toJson(jsonEntries{.*, facebookPage: { link: jsonEntries.facebookPage.link, amount: jsonEntries.amount + 1 }})
RETURN l as p

这是一个显示 .* 工作的最小示例:

WITH {instagramPage: {link: "instagram.com"}} AS entry
RETURN entry {.*, facebookPage: {link: "facebook.com"}}

Output:
{
  "facebookPage": {
    "link": "facebook.com"
  },
  "instagramPage": {
    "link": "instagram.com"
  }
}

令人高兴的是,以这种方式解构还会在发生冲突时用更新的值替换地图中的现有字段:

WITH {instagramPage: {link: "instagram.com"}} AS entry
RETURN entry {.*, instagramPage: {link: "newinstagram.com"}}

Output:
{
  "instagramPage": {
    "link": "newinstagram.com"
  }
}