我目前在学习Neo4J和Cypher的时候很早,所以我很高兴能得到任何建议!
我正在寻找的是获取“项目”列表。这些项目来自“列表”,可以由我直接“拥有”,也可以由“集团”“拥有”我是“会员”:
到目前为止,我有(从我直接拥有的列表中获取项目):
MATCH (owner:User {identifier: "b3b57bc7-f7d2-4915-89b7-b111510d66b0"})-[OWNS]->(list:List)-[HAS]->(item:Item)
RETURN {identifier: item.identifier, title: item.title, list: list.identifier}
我如何赞同我所属的团体名单?
我希望得到以下格式(以满足GraphQL):
[
{
identifier: "item-1-identifier,
title: "My Item",
list: "list-1-identifier"
},
{
identifier: "item-2-identifier,
title: "My Item on another list",
list: "list-2-identifier"
}
]
谢谢!
答案 0 :(得分:3)
要将列表和组列表放在一个列中,您可以更改遍历的关系以匹配任一路径,或者您需要使用UNION或收集两组项目并合并收集,然后UNWIND回到行。
这是一个改变遍历关系的例子,这应该是最简单的。
MATCH (owner:User {identifier: "b3b57bc7-f7d2-4915-89b7-b111510d66b0"})-[:MEMBER*0..1]->()-[:OWNS]->(list:List)-[:HAS]->(item:Item)
RETURN {identifier: item.identifier, title: item.title, list: list.identifier}
0
关系:MEMBER
的下限意味着它是可选的,这将允许模式匹配用户的列表和组列表用户是会员。
答案 1 :(得分:1)
我创建了一个小数据集来重现您的场景。可以找到此数据集的脚本here。
替代InverseFalcon solution(以及InverseFalcon提及),您可以使用COLLECT和UNWIND执行此操作,如下所示:
// First match all items from lists owned by the user
MATCH (user:User {identifier:"b3b57bc7-f7d2-4915-89b7-b111510d66b0"})-[:OWNS]->(list:List)-[:HAS]->(item:Item)
// Pass the user and all information about items and list to the next context
WITH user, COLLECT({identifier: item.identifier, title: item.title, list: list.identifier}) AS userListItems
// Match all items from lists owned by groups that the user is a member
MATCH (user)-[:MEMBER]->(group:Group)-[:OWNS]->(list:List)-[:HAS]->(item:Item)
// Collect the result and add the previous result
WITH COLLECT({identifier: item.identifier, title: item.title, list: list.identifier}) + userListItems as allItems
// anwind all
UNWIND allItems as unwinded
// return in the desired format
RETURN {identifier: unwinded.identifier, title: unwinded.title, list: unwinded.identifier}
基于数据集的结果:
╒══════════════════════════════╕
│"{identifier: unwinded.identif│
│ier, title: unwinded.title, li│
│st: unwinded.identifier}" │
╞══════════════════════════════╡
│{"identifier":"item3","title":│
│"Item 3","list":"item3"} │
├──────────────────────────────┤
│{"identifier":"item1","title":│
│"Item 1","list":"item1"} │
├──────────────────────────────┤
│{"identifier":"item2","title":│
│"Item 2","list":"item2"} │
├──────────────────────────────┤
│{"identifier":"item6","title":│
│"Item 6","list":"item6"} │
├──────────────────────────────┤
│{"identifier":"item4","title":│
│"Item 4","list":"item4"} │
├──────────────────────────────┤
│{"identifier":"item5","title":│
│"Item 5","list":"item5"} │
├──────────────────────────────┤
│{"identifier":"item9","title":│
│"Item 9","list":"item9"} │
├──────────────────────────────┤
│{"identifier":"item7","title":│
│"Item 7","list":"item7"} │
├──────────────────────────────┤
│{"identifier":"item8","title":│
│"Item 8","list":"item8"} │
└──────────────────────────────┘
根据PROFILE,此查询将数据库命中62次。非常类似于InverseFalcon提供的非常优雅的解决方案,可以在数据库中使用61次。