在Neo4j中,对于每个不相交的子图,返回关系最多的节点

在Neo4j中,对于每个不相交的子图,返回关系最多的节点,neo4j,cypher,graph-theory,Neo4j,Cypher,Graph Theory,我是Neo4j和图论的新手,我想知道我是否可以用Neo4j来解决我遇到的问题。如果我用错误的词来描述东西,请纠正我。因为我对这门学科还不熟悉,所以我还没有真正了解什么叫一切 我认为描述我的问题最简单的方法就是用大量的图片。 假设有两个不相交的子图,看起来像这样 从上面的子图中,我想得到满足两个条件之一的子图列表 标准1. 如果一个节点与另一个节点具有唯一的关系,则该节点和关系应作为子图返回 标准2. 如果关系不是唯一的,我希望返回具有最多关系的节点,作为具有其关系和相关节点的子图 如果其他节点

我是Neo4j和图论的新手,我想知道我是否可以用Neo4j来解决我遇到的问题。如果我用错误的词来描述东西,请纠正我。因为我对这门学科还不熟悉,所以我还没有真正了解什么叫一切

我认为描述我的问题最简单的方法就是用大量的图片。 假设有两个不相交的子图,看起来像这样

从上面的子图中,我想得到满足两个条件之一的子图列表

标准1. 如果一个节点与另一个节点具有唯一的关系,则该节点和关系应作为子图返回

标准2. 如果关系不是唯一的,我希望返回具有最多关系的节点,作为具有其关系和相关节点的子图

如果其他节点符合条件2,我希望返回所有子图

或者放在这个图表的上下文中

给我那些有独特游戏的人,如果有其他人有相同的游戏,给我那些游戏最多的人。如果他们打成平局,则返回所有打成平局的人。 或者实际上,返回整个子图,而不仅仅是人

为了澄清我的想法,这里有一张图片描述了我想要得到的结果。结果的顺序并不重要

不相交子图A,因为条件1,安德鲁是唯一有气泡的人

不相交的子图B,因为条件1,Johan是唯一一个有谜题Bobble 1的人

不相交子图C,因为条件2,朱莉娅因为她有最多的游戏

不相交的子图D,因为标准2,Anna因为她与Julia的游戏次数最多

值得一提的是,约翰与《Bobble 2》的关系并没有回归,因为这并不是唯一的,他也没有玩过最多的游戏

这是一个你只用Neo4j就能解决的问题吗?这是个好主意吗

如果你能解决这个问题,你会如何在Cypher中解决

创建脚本:

  CREATE  (p1:Person {name:"Johan"}),
      (p2:Person {name:"Julia"}),
      (p3:Person {name:"Anna"}),
      (p4:Person {name:"Andrew"}),

      (v1:Videogame {name:"Puzzle Bobble 1"}),
      (v2:Videogame {name:"Puzzle Bobble 2"}),
      (v3:Videogame {name:"Puzzle Bobble 3"}),
      (v4:Videogame {name:"Puzzle Bobble 4"}),
      (v5:Videogame {name:"Bubble Bobble"}),

       (p1)-[:HAS]->(v1),
       (p1)-[:HAS]->(v2),

       (p2)-[:HAS]->(v2),
       (p2)-[:HAS]->(v3),
       (p2)-[:HAS]->(v4),

       (p3)-[:HAS]->(v2),
       (p3)-[:HAS]->(v3),
       (p3)-[:HAS]->(v4),

       (p4)-[:HAS]->(v5)

我觉得这个解决方案可能不是您想要的,但它可能是一个良好的开端:

MATCH (game:Videogame)<-[:HAS]-(owner:Person)
OPTIONAL MATCH owner-[:HAS]->(other_game:Videogame)
WITH game, owner, count(other_game) AS other_game_count
ORDER BY other_game_count DESC
RETURN game, collect(owner)[0]
比赛(游戏:电子游戏)(其他游戏:电子游戏)
使用游戏、所有者、计数(其他游戏)作为其他游戏计数
由其他方订购\u游戏\u计数说明
返回游戏,收集(所有者)[0]
以下是查询:

  • 查找所有游戏及其所有者(不匹配没有所有者的游戏)
  • 可选游戏是否与所有者可能拥有的任何其他游戏进行了匹配(通过进行可选游戏,我们可以说,如果他们拥有零,那么就可以了)
  • 通过每个游戏/所有者对以及该所有者拥有的其他游戏数量的计数,进行排序,以便拥有最多游戏的玩家排在第一位
  • RETURN
    每个游戏的第一个所有者(执行
    收集时,
    顺序将被保留)

一个人可以拥有一个独特的游戏,并与拥有更多游戏的人共享集群–在这种情况下,您希望返回谁?今天是圣诞节,安德鲁得到了拼图Bobble 1,安娜得到了Arkanoid。现在Andrew和Anna共享一个集群,Anna拥有集群中最多的游戏,但是Andrew仍然有一个独特的游戏-你想要谁回来?正如@jjaderberg所指出的,你的问题陈述是有缺陷的。一个“集群”(似乎是“不相交子图”的另一个名称)不仅可以有多人玩的许多游戏,还可以有每个人只玩一个人玩的许多“独特游戏”。仅仅因为一个游戏只有一个玩家并不意味着该玩家不玩其他游戏。所以,请澄清你到底想做什么。谢谢大家的反馈,我会更新帖子的@cybersam感谢您指出它被称为“不相交子图”,而不是“簇”。当你试图找到关于事物的信息时,了解事物的名称确实很有帮助。