如何返回每个另一个节点属性的最大计数

2024-05-09

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

除了过滤除每十年最高计数之外的所有内容之外,该密码可以执行所有操作。

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 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 查询计划器设置为Cypher 2.1,如果第一行是,性能最好MATCH (c:Composer)-[r:CREATED_BY]-(w)<-[r2:REL_TYPE]-(prog)。仅在第一个节点上使用标签来帮助WHERE做好它的工作。始终始终使用节点和相关标识符。
  • 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变量,它将把每个可选匹配的结果拖到下一个,本质上是试图过滤,并且我们不会得到完全独立的路径。 (为什么我们能够重用w现在有点超出我的能力...)不过没关系。我们获取结果,将它们放入数组中,过滤空结果,然后将其展开回包含所有有效结果的单个变量。之后,我们继续正常进行。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何返回每个另一个节点属性的最大计数 的相关文章

  • Neo4j聚合函数

    我正在尝试使用SUM函数并将其结果存储为关系的新属性 但它不起作用 我使用的查询是 MATCH a Employee r CorporateMessage gt b WHERE a Eid 6001 AND b Eid IN 6002 60
  • neo4j 在从 csv 导入期间指定数据类型

    有没有办法在导入时告诉neo4j值的类型 例如 neo4j 是否知道 2015 0104T10 33 44 是日期还是字符串 thanks Neo4j 使用 Java 原始类型 字符串或数组作为属性值 没有日期类型 所以 2015 0104
  • 将最短路径中的所有节点作为对象列表返回

    我有以下 Cypher 查询 它在 Neo4j 2 0 0 中运行良好 MATCH ab Point Latitude 24 96325 Longitude 67 11343 cd Point Latitude 24 95873 Longi
  • 一起使用 MongoDB 和 Neo4j

    我正在开始一个新项目 我正在考虑使用 MongoDB 作为文档存储工具 使用 Neo4j 作为映射文档之间关系的机制 然后我想通过 REST API 公开查询结果 人们会说这样做的优点和缺点是什么 是否有更好的方法可以使用不同的 NoSQL
  • 如何删除neo4j中的所有索引?

    我想使用 cypher 批量删除所有存在的索引 可以吗 我正在使用 neo4j 3 4 7 DROP INDEX ON Label attributename 如果我在稍后阶段创建相同的索引 它会替换现有索引吗 删除所有索引和约束的快速方法
  • 如何在 Neo4j 遍历的每一步中指定使用哪种关系类型作为当前节点的函数?

    我想使用 neo4j 遍历 API 遍历我的图 但我需要能够指定在每一步使用哪种关系类型 并且要使用的关系类型需要是当前节点的函数 有没有办法做到这一点 在当前的 Traverser API 中 您无法选择要遍历的确切关系 相反 您可以采用
  • Neo4j:无法创建具有嵌套属性的节点

    我到处寻找 但找不到这个问题的答案 我需要创建一个节点Config它有一个带有 2 个键 值对的动态属性对象 例如 name and type 查询时 键应该最终为properties name and properties type 但我
  • Neo4j - 计算带有标签的节点

    我想要一个查询来计算数据集中有多少个节点具有每个标签 例如 标签A 100 标签B 200 我可以为每个单独的标签执行此操作 例如 MATCH n LabelA return count n 但是 我想在一个命令中为每个标签执行此操作 尝试
  • spring data neo4j 5 - 没有名为“sessionFactory”的bean可用

    我正在使用 spring data neo4j 5 0 7 RELEASE 和 spring 5 0 6 RELEASE 使用文档中的配置https github com spring projects spring data neo4j
  • 在 Neo4j 中可视化连接的组件

    我可以使用下面的代码找到图中最密集连接的组件 CALL algo unionFind stream pnHours YIELD nodeId setId groupBy setId storing all node ids of the s
  • Neo4j 的 Cypher 查询语言是开源的吗?

    Neo4j的语言Cypher的现状如何 我真的很喜欢它 但我想避免 Neo4j 锁定 是否还有像 Gremlin 中那样的其他 Cypher 界面 Regards Cypher 完全是 OSS 请参阅https github com neo
  • 如何将dbpedia导入neo4j? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我需要将 dbpedia 导入 neo4j 我从这里下载 dbpedia http wiki dbpedia org Download
  • 如何在neo4j中显示屏幕上的所有节点

    我有近 5000 个节点Recipes和 5 个节点Meal Types在 Neo4j 数据库中 目前他们之间没有任何关系 我正在下面运行 CQL MATCH n RETURN n LIMIT 100000 这运行良好 但它返回与相关的节点
  • 如何使用 nosql 构建成就和徽章

    我目前有一个使用 mongodb 作为数据库的社交游戏应用程序 我的问题是 如果我想创建一个积分和徽章系统 有哪些建议 成就 徽章的业务逻辑可能会变得非常复杂并且非常临时 因此实时授予徽章似乎效率不高 我想象将跟踪的操作添加到队列中的某处
  • 带子图聚合的递归查询(任意深度)

    我问了一个问题earlier https stackoverflow com questions 28036055 recursive query with sub graph aggreagation关于沿着图表聚合数量 提供的两个答案效
  • 启用远程访问neo4j 4.2社区版

    由于在家工作 我需要一种方法来监视远程 neo4j 实例 最好通过 Web 浏览器实例 在过去 例如在3 0中 它可以通过以下方式轻松实现修改单个配置行 https neo4j com developer kb how do i enabl
  • Cypher:从集合中提取唯一值

    I have MATCH x rels gt y RETURN extract r in rels r property as collected where collected是路径上所有关系的属性的集合 例如 null 4 null 4
  • 如何转储 neo4j 图形数据库?

    我将所有数据库存储在一个位置C JATIN DATA 数据库 neo4jDatabases 如何使用 neo4j Desktop 单独转储所有数据库 我已经尝试过 neo4j admin dump database to 这个命令但出现错误
  • 如何在 Gremlin 中查找公共顶点数并对结果进行排序?

    我的架构有两种类型的节点 node1 学生 id为主键 节点2 技能 技能名称为主键 他们之间的关系是HAS SKILL 我的用例 对于给定的学生 Id 我需要获取技能最匹配的相似用户 技能计数和常用技能列表 我尝试过的查询 g V has
  • 如何结识有相同兴趣的朋友的朋友?

    交朋友的朋友很容易 我得到了这个 看起来效果很好 g v 1 in FRIEND in FRIEND filter it g v 1 但我想做的只是结交有相同兴趣的朋友的朋友 下面我希望 Joe 被推荐为 Moe 而不是 Noe 因为他们没

随机推荐