2017-05-28 72 views
2

我正在尝试使用Node.js构建休息API,它使用Neo4j-Bolt-Driver连接到Neo4j-Db。随着终端和图形的复杂性不断增长,编写和维护大量长Cypher查询变得越来越困难。Neo4j将数据序列化为JSON

我有一些困难,以填充JSON对象应该包含一些关系到其他节点。

下面您会看到针对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{.*}} 

当连接到用户的节点可以具有不同的标签时,情况会变得更糟。在这种情况下;我应该在密码查询中编写一个switch case表达式来正确地填充不恰当的相关字段。

对此有何建议?

回答

0

那么你可以做的一件事是使用模式理解来照顾可选匹配并在一个步骤中收集。只是一个小的语法改进。

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} 

至于具有不同标签和字段的其他节点,您能举个例子吗?