gpt4 book ai didi

neo4j - 如何返回每个节点属性的最大计数

转载 作者:行者123 更新时间:2023-12-01 12:37:59 33 4
gpt4 key购买 nike

我需要计算一位 Composer 的音乐作品每十年被演奏了多少次,然后只返回每十年演奏次数最多的一首作品。

这个密码除了过滤每十年最高计数之外的所有内容。

match (c:Composer)-[:CREATED_BY]-(w:Work)<-[*..2]-(prog:Program) 
WHERE c.lastname =~ '(?i).*stravinsky.*'
WITH w.title AS Title, prog.title AS Program, LEFT(prog.date, 3)+"0" AS Decade
RETURN Decade, Title, COUNT(Program) AS Total
ORDER BY Decade, Total DESC, Title

几个小时以来,我一直在思考各种变体,但找不到解决方案。

最佳答案

这似乎返回了您正在寻找的内容,但它可能会得到改进。

MATCH (c:Composer)-[r:CREATED_BY]-(w:Work)<-[*..2]-(prog:Program)
WHERE c.lastname =~ '(?i).*stravinsky.*'
WITH LEFT(prog.date, 3)+"0" AS Decade, w.title AS Title, COUNT(prog.title) AS Total
ORDER BY Decade, Total DESC, Title
RETURN Decade, HEAD(COLLECT(Total)) AS Total, HEAD(COLLECT(Title)) AS Title
ORDER BY Decade

它只返回每个十年的一个结果,但没有考虑关系,所以对我来说感觉有点不完整。如果我想出好的东西,我会考虑如何去做并进行编辑。

我将此字符串与 http://graphgen.neoxygen.io 一起使用在本地生成示例数据。

(c:Composer {firstname: firstName, lastname: lastName} *10)<-[:CREATED_BY *n..1]-(w:Work {title: progLanguage} *75)<-[:PERFORMED *n..1]-(prog:Program {title: catchPhrase, date: date} *400)

胜利编辑

这是上述查询的原始版本,当有联系时将显示多个作品。

MATCH (c:Composer)-[r:CREATED_BY]-(w:Work)<-[*..2]-(prog:Program)
WHERE c.lastname =~ '(?i).*stravinsky.*'
WITH LEFT(prog.date, 3)+"0" AS Decade, w.title AS Title, COUNT(prog.title) AS Total
ORDER BY Decade, Total DESC, Title
WITH Decade, Title, Total, HEAD(COLLECT(Total)) AS PerformedTotal
WITH Decade, [title in COLLECT(Title) WHERE Total = PerformedTotal] as Title, Total, PerformedTotal
ORDER BY PerformedTotal DESC
return Decade, HEAD(COLLECT(PerformedTotal)) as Totals, HEAD(COLLECT(Title)) as Titles
ORDER BY Decade

我觉得应该可以重构它,但我似乎无法简化它。

关于撰写此答案的过程,我有大量笔记。即使它不完全是您要找的东西,这也是 TLDR,因为它仍然很有趣。

  • 如果可以的话,摆脱那种模糊搜索,找到一种方法来索引该属性或使用外部索引,如 Elasticsearch。使用该正则表达式时,性能会受到巨大影响。
  • Neo4j 2.2.M02 中有一个错误,如果 <-[*..2]- 会导致查询崩溃被更改为几乎任何其他东西。如果将 Cypher Query Planner 设置为 Cypher 2.1 , 如果第一行是 MATCH (c:Composer)-[r:CREATED_BY]-(w)<-[r2:REL_TYPE]-(prog) 则性能最佳.仅在第一个节点上使用标签来帮助 WHERE做它的工作。始终始终始终使用节点和 rel 标识符。
  • Cypher 有一些令人惊讶的行为。整个[title in COLLECT(Title) WHERE Total = PerformedTotal]正在使用同一行后面的变量。如果我将它们拉出来,它就会崩溃。

更令人惊讶的行为是无法按照我期望的方式进行重构。我希望这样做但不能:

MATCH (c:Composer)-[r:CREATED_BY]-(w:Work)<-[*..2]-(prog:Program)
WHERE c.lastname =~ '(?i).*stravinsky.*'
WITH LEFT(prog.date, 3)+"0" AS Decade, w.title AS Title, COUNT(prog.title) AS Total
ORDER BY Decade, Total DESC, Title
WITH Decade, [title in COLLECT(Title) WHERE Total = HEAD(COLLECT(Total))] as Title, Total, HEAD(COLLECT(Total)) AS PerformedTotal
ORDER BY PerformedTotal DESC
return Decade, HEAD(COLLECT(PerformedTotal)) as Totals, HEAD(COLLECT(Title)) as Titles
ORDER BY Decade

另一个编辑:如何可能加快速度

如果您有一些可能的路径,您的查询可能会采用但您想避免 [*..2] ,您可以通过指定有关尝试查找匹配项时应采用的路径的具体信息来加快速度。这是否更快实际上取决于它可以采取多少分支,这将是死胡同。如果你可以只给它两个或三个路径,这样它就可以完全忽略六个其他关系,它可能会抵消过滤和以后发生的事情。当然,如果路径足够复杂,这可能会带来更多麻烦。

您应该将其弹出到 neo4j-shell 中并在前面加上 PROFILE ,在末尾添加一个分号,并查看数据库访问次数以确定最适合您的数据集。

MATCH (c:Composer)-[r:CREATED_BY]-(w)
WHERE c.lastname =~ '(?i).*Denesik.*'
OPTIONAL MATCH (w)-[r2:CONNECTED_TO]-(this_node)<-[r3:ONE_MORE]-(prog1)
OPTIONAL MATCH (w)<-[r4:PERFORMED]-(prog2)
OPTIONAL MATCH (w)-[r5:THIS_REL]->(this_node)-[r6:AGAIN_WITH_THE_RELS]->(prog3)
WITH FILTER(program in [prog1, prog2, prog3] WHERE program IS NOT NULL) AS progarray, w.title AS Title
UNWIND(progarray) as prog
WITH LEFT(prog.date, 3)+"0" AS Decade, COUNT(prog.title) AS Total, Title
ORDER BY Decade, Total DESC, Title
WITH Decade, Title, Total, HEAD(COLLECT(Total)) AS PerformedTotal
WITH Decade, [title in COLLECT(Title) WHERE Total = PerformedTotal] as Title, Total, PerformedTotal
ORDER BY PerformedTotal DESC
return Decade, HEAD(COLLECT(PerformedTotal)) as Totals, HEAD(COLLECT(Title)) as Titles
ORDER BY Decade;

其中最棘手的部分是如果我们重用 prog变量,它将把每个 OPTIONAL MATCH 的结果拖到下一个,本质上是尝试过滤,我们不会得到完全独立的路径。 (为什么我们能够重用 w 现在有点超出我的理解......)不过没关系。我们获取结果,将它们放入数组中,过滤空结果,然后将其展开回包含所有有效结果的单个变量。之后,我们将照常进行。

在我的测试中,使用正确的数据集似乎可以显着加快速度。 YMMV.

关于neo4j - 如何返回每个节点属性的最大计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27850600/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com