【问题标题】:Limiting nodes per label每个标签限制节点
【发布时间】:2014-09-09 10:53:12
【问题描述】:

我有一个图表,目前大约有几千个节点,每个节点都有两到十个关系。如果我们查看单个节点及其连接,它们看起来有点像这样:

带有字母字符的节点是类别节点。所有其他节点都是与这些类别节点具有associated with 关系的内容节点,它们的颜色表示附加了哪些标签。为简单起见,每个节点都有一个标签,每个节点只连接到一个其他节点:

  • 蓝色:类别
  • 绿色:科学出版物
  • 橙色:一般文章
  • 紫色:博客文章

现在,我正在尝试做的最简单的事情是将一定数量的相关内容节点添加到给定节点。以下返回所有 20 个相关节点:

START n = node(1)
MATCH (n)-->(category)<--(m)
RETURN m

但是,我想将其过滤为每个类别每个标签 2 个节点(然后按多个类别与起始节点重叠的节点进行排序。

目前我正在通过从上述查询中获取结果,然后手动循环遍历结果来执行此操作,但这对我来说感觉像是多余的工作。

有没有办法通过 Neo4j 的密码查询语言来做到这一点?

【问题讨论】:

    标签: neo4j cypher graph-databases


    【解决方案1】:

    此答案扩展了@Stefan 的原始答案,以返回所有类别的结果,而不仅仅是其中一个。

    START p = node(1)
    MATCH (p)-->(category)<--(m)
    WITH category, labels(m) as label, collect(m)[0..2] as nodes 
    UNWIND label as lbl
    UNWIND nodes AS n
    RETURN category, lbl, n
    

    为了方便人工验证结果,也可以在最后加上这一行,对结果进行排序。 (这种排序可能不应该出现在你的最终代码中,除非你真的需要排序结果并且愿意花费额外的计算时间):

    ORDER BY id(category), lbl
    

    【讨论】:

    • 谢谢,这确实是我想要的。
    【解决方案2】:

    Cypher 有一个 labels 函数返回一个数组,其中包含给定节点的所有标签。假设每个 m 节点只有一个标签,以下方法可能有效:

    START n = node(1)
    MATCH (n)-->(category)<--(m)
    WITH labels(m)[0] as label, collect[m][0..2] as nodes 
    UNWIND nodes as n
    RETURN n
    

    WITH 语句建立了共享相同标签的所有节点的单独集合。使用下标运算符[0..2] 集合只保留前两个元素。 Unwind 然后将集合转换为结果的单独行。从这里您可以申请订购。

    【讨论】:

    • 不知何故,这在遇到的第一个类别节点处停止。在上图中运行它会返回四个节点(即 2、3、4 和 6),如果我只有一个类别,这确实是我想要的,但是,在这种情况下,我正在寻找除 4 之外的所有数字节点其中: 16. collect 方法是否覆盖?
    • 哦,我明白了,collect 创建了 2 个组,每个标签一个(因此大小分别为 8 和 12)。执行collect(m)[0..8] 之类的操作将返回 16 个节点和每个标签的正确数量,但不是每个类别的每个标签 2 个。
    猜你喜欢
    • 1970-01-01
    • 2015-11-24
    • 2010-11-20
    • 2020-06-08
    • 1970-01-01
    • 2017-04-27
    • 2019-09-09
    • 2020-09-16
    • 1970-01-01
    相关资源
    最近更新 更多