在cypher、UNWIND或FOREACH中循环(Neo4j)

在cypher、UNWIND或FOREACH中循环(Neo4j),neo4j,cypher,Neo4j,Cypher,我在neo4j数据库中有一个关系: (r:RateableEntity)<-[t:TAG]-(h:HashTags) 我写了这个密码: MATCH p = (r:RateableEntity)<-[t:TAG]-(h:HashTag) UNWIND TAIL (NODES(p)) AS hash WITH COUNT(hash) as Count, h, hash ORDER BY hash LIMIT 3 WHERE h.tag in hash.tag MATCH (r:Rate

我在neo4j数据库中有一个关系:

(r:RateableEntity)<-[t:TAG]-(h:HashTags)
我写了这个密码:

MATCH p = (r:RateableEntity)<-[t:TAG]-(h:HashTag)
UNWIND TAIL (NODES(p)) AS hash
WITH COUNT(hash) as Count, h, hash
ORDER BY hash LIMIT 3
WHERE h.tag in hash.tag
MATCH (r:RateableEntity)<-[:TAG]-(h:HashTag)
 RETURN DISTINCT h.tag, r.id, Count
 LIMIT 3

要记住的一些事情:

  • 对每一行执行密码运算符

  • 尽量不要把放松看成是一种循环结构。所有这些都是对一行中的变量和列表中的元素进行笛卡尔积

  • 因此,当您展开列表时,列表中的每个元素都会有一行,以及该行中已经存在的所有变量。然后,当后续操作(如匹配或WITH)针对每一行执行时,它看起来像一个循环结构,但实际上不是

    无论如何,这里不需要放松。对于两节点匹配模式,
    tail(nodes(p))
    将只是一个仅包含最后一个节点的元素列表。它没有改变行数(因为列表大小是1),在这里也帮不了你

    此查询应能更好地工作:

    MATCH (h:HashTag)
    WITH h LIMIT 3 // best to limit early to avoid doing unnecessary work
    WITH h, h.tag as hashtagName, size((h)-[:TAG]->()) as hashtagCount, [(h)-[:TAG]->(r:RateableEntity) | r.id] as hashtagItems
    WITH h {hashtagName, hashtagCount, hashtagItems} as entry
    RETURN collect(entry) as hashtagList
    
    编辑

    如果您希望按大小列出前3个hashtag,则可以使用下面修改的查询:

    MATCH (h:HashTag)
    WITH h, size((h)-[:TAG]->()) as hashtagCount
    ORDER BY hashtagCount DESC
    LIMIT 3
    WITH h, hashtagCount, h.tag as hashtagName, [(h)-[:TAG]->(r:RateableEntity) | r.id] as hashtagItems
    WITH h {hashtagName, hashtagCount, hashtagItems} as entry
    RETURN collect(entry) as hashtagList
    

    要记住的一些事情:

  • 对每一行执行密码运算符

  • 尽量不要把放松看成是一种循环结构。所有这些都是对一行中的变量和列表中的元素进行笛卡尔积

  • 因此,当您展开列表时,列表中的每个元素都会有一行,以及该行中已经存在的所有变量。然后,当后续操作(如匹配或WITH)针对每一行执行时,它看起来像一个循环结构,但实际上不是

    无论如何,这里不需要放松。对于两节点匹配模式,
    tail(nodes(p))
    将只是一个仅包含最后一个节点的元素列表。它没有改变行数(因为列表大小是1),在这里也帮不了你

    此查询应能更好地工作:

    MATCH (h:HashTag)
    WITH h LIMIT 3 // best to limit early to avoid doing unnecessary work
    WITH h, h.tag as hashtagName, size((h)-[:TAG]->()) as hashtagCount, [(h)-[:TAG]->(r:RateableEntity) | r.id] as hashtagItems
    WITH h {hashtagName, hashtagCount, hashtagItems} as entry
    RETURN collect(entry) as hashtagList
    
    编辑

    如果您希望按大小列出前3个hashtag,则可以使用下面修改的查询:

    MATCH (h:HashTag)
    WITH h, size((h)-[:TAG]->()) as hashtagCount
    ORDER BY hashtagCount DESC
    LIMIT 3
    WITH h, hashtagCount, h.tag as hashtagName, [(h)-[:TAG]->(r:RateableEntity) | r.id] as hashtagItems
    WITH h {hashtagName, hashtagCount, hashtagItems} as entry
    RETURN collect(entry) as hashtagList
    

    我的问题是这样的,也许其他人需要知道:

    MATCH (:RateableEntity)<-[:TAG]-(p:HashTag)
    RETURN p.tag As Tag, COUNT(p) as Count, [(p)-[:TAG]->(m) | m.id][..3] AS 
    RateableEntities ORDER BY Count DESC LIMIT 3
    
    将(:应课差饷租值实体)(m)| m.id][…3]匹配为
    应课差饷租值单位按计数顺序说明限额3
    
    以下是网站上文档的链接:


    我发现这是我的问题,也许其他人需要知道:

    MATCH (:RateableEntity)<-[:TAG]-(p:HashTag)
    RETURN p.tag As Tag, COUNT(p) as Count, [(p)-[:TAG]->(m) | m.id][..3] AS 
    RateableEntities ORDER BY Count DESC LIMIT 3
    
    将(:应课差饷租值实体)(m)| m.id][…3]匹配为
    应课差饷租值单位按计数顺序说明限额3
    
    以下是网站上文档的链接:


    非常感谢您的快速回答,它正按照我的预期工作。只需再问一个问题,如果我想按
    top
    size
    订购,您有什么建议?谢谢您的回复,但我刚刚发现
    限制
    没有按预期工作,但我正在发布另一种方式,我在
    neo4j
    网站上找到了这种方式。再次,我需要修改此查询以返回与此
    标签
    相关的项目,按
    创建日期
    排序(因为所有这些项目都具有
    创建日期
    属性),感谢您的帮助听起来您可能应该为此创建一个新问题,包括您迄今为止尝试过的内容、为什么它不是您所需要的,以及示例输入和预期输出。非常感谢您的快速回答,它正在按照我的预期工作。只需再问一个问题,如果我想按
    顶部大小订购,你有什么建议?谢谢你的回复,但我刚刚发现限制没有按预期工作,但我正在发布我在
    neo4j
    网站上发现的另一种方式,我需要修改此查询以返回与此
    标签
    、order by
    createdDate
    (因为所有这些项目都具有
    createdDate
    属性)相关的项目,感谢您的帮助听起来您可能应该为此创建一个新问题,并包括您迄今为止尝试的内容,为什么它不是您需要的,以及示例输入和预期输出。