【问题标题】:How to group matched results in Neo4J/Cypher如何在 Neo4J/Cypher 中对匹配的结果进行分组
【发布时间】:2019-03-22 14:19:45
【问题描述】:

我对 Neo4J 和 Cypher 非常陌生,我必须处理高度相关的数据集。图模型是这样的

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

我正在寻找一种方法来获得以下信息:对于每一对独特的 Lo-F,获取所有 C 并计算每对这样的独特 C 的数量。

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

  • 有多少独特的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 方法准备匹配以完成此操作。

【问题讨论】:

    标签: graph neo4j cypher


    【解决方案1】:

    你很亲密。这应该适合你:

    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
    

    另外请注意,在查询中包含关系方向性会更有效。

    【讨论】:

    • 感谢您的提示!但现在我所有的 _counts = 1。我想我之前尝试过这个并遇到了同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多