寻找直接的“朋友”和“群体”朋友

时间:2017-05-14 12:55:48

标签: neo4j cypher

我目前在学习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"
  }
]

谢谢!

2 个答案:

答案 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提及),您可以使用COLLECTUNWIND执行此操作,如下所示:

// 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次。