我正在尝试使用 Node.js 构建一个 Rest api,它使用 Neo4j-Bolt-Driver连接到 Neo4j-Db。
随着图的端点和复杂性的增长,编写和维护大量长 Cypher 查询变得越来越困难。
我在提供填充的 JSON 对象时遇到一些困难,这些对象应该包含与其他 Node 的一些关系。
下面您将看到针对 GET/api/me 端点的查询。
MATCH (user:User) WHERE user.uuid = {userId}
OPTIONAL MATCH (user)-[:PROFILE_IMAGE]->(profileImage:Image)
OPTIONAL MATCH (user)-[:HEADER_IMAGE]->(headerImage:Image)
OPTIONAL MATCH (user)-[:OWNS]->(productToEmbed:Product)-[:TYPE]->(productType:ProductType)
WITH user, COLLECT(productToEmbed{.*, type: productType.name }) AS products
RETURN user{.*, products: products, profileImage: profileImage{.*}, headerImage: headerImage{.*}}
当连接到用户的 Node 可以具有不同的标签时,情况会变得更糟。在这种情况下;我应该在 cypher 查询中编写一个 switch case 表达式来正确填充相关字段,但感觉不正确。
对此有什么建议吗?
最佳答案
您可以做的一件事是使用模式理解来处理可选匹配并在一个步骤中收集。只是一个小的语法改进。
MATCH (user:User) WHERE user.uuid = {userId}
OPTIONAL MATCH (user)-[:PROFILE_IMAGE]->(profileImage:Image)
OPTIONAL MATCH (user)-[:HEADER_IMAGE]->(headerImage:Image)
WITH user, profileImage, headerImage,
[(user)-[:OWNS]->(productToEmbed:Product)-[:TYPE]->(productType:ProductType) |
productToEmbed {.*, type: productType.name}] as products
RETURN user{.*, products, profileImage, headerImage}
对于其他具有不同标签和字段的 Node ,您能否提供示例?
关于node.js - Neo4j 将数据序列化为 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44230686/