如何在Neo4J / Cypher中对匹配结果进行分组

时间:2019-03-22 14:19:46

标签: graph neo4j cypher

我对Neo4J和Cypher还是很陌生,我必须处理一个高度相关的数据集。图模型看起来像这样

enter image description here

在我的数据中,我有C,A,Le的多个实例,只有Lo,R,F的几个实例。

我正在寻找一种方法来获取以下内容:对于Lo-F的每个唯一对,获取所有C并计算每个这样的对有多少个唯一C。

换句话说,我希望所有CLO共享相同的所有F组,我需要我的结果告诉我:

  • 多少个独特的C
  • 通用LO
  • 普通F

我谦虚的开始是MATCH这样的模式(箭头的方向与该问题无关)

MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
      (le)--(lo:LO)
RETURN f, lo, c LIMIT 5

将返回所有匹配的模式。然后,我尝试使用collectcount。例如,

MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
      (le)--(lo:LO)
RETURN f, lo, collect(c), COUNT(*) as _counts
ORDER BY _counts LIMIT 5

这似乎给了我一张具有唯一f-lo对的表格以及C列表以及计数。但是,collect(c)列重复了C,因此_counts是不正确的。然后,我尝试介绍DISTINCT

MATCH (c:C)--(:A)--(le:LE)--(:R)--(f:F),
      (le)--(lo:LO)
RETURN f, lo, collect(DISTINCT c), COUNT(*) as _counts
ORDER BY _counts LIMIT 5

但是我有相同的结果...

我已经在Google上进行了广泛的搜索,但是由于我对SQL还是很陌生,因此我发现大多数教程和示例在其SQL类目中都很难遵循。

此外,将其更好地构建为聚类算法会更好吗?我已经安装了algo插件,但是我很难理解如何为.stream方法准备匹配项。

1 个答案:

答案 0 :(得分:0)

你很近。这应该为您工作:

MATCH (c:C)<--(:A)-->(le:LE)-->(:R)-->(f:F),
      (le)-->(lo:LO)
WITH f, lo, COLLECT(DISTINCT c) AS cs
RETURN f, lo, cs, SIZE(cs) as _counts
ORDER BY _counts LIMIT 5

还请注意,在查询中包括关系方向性会更有效。