Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 如何返回每个其他节点的最大计数';s属性_Neo4j_Cypher - Fatal编程技术网

Neo4j 如何返回每个其他节点的最大计数';s属性

Neo4j 如何返回每个其他节点的最大计数';s属性,neo4j,cypher,Neo4j,Cypher,我需要计算一个作曲家的作品每十年演奏多少次,然后只返回每十年演奏次数最多的一首 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

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

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)-[: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)-[:CREATED_BY]-(w:Work)这似乎返回了您想要的结果,但它可能会得到改进

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
另一次编辑:如何加快速度

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

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

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;
MATCH(c:编写者)-(r:创建者)-(w)
其中c.lastname=~'(?i)。*Denesik.*
可选匹配(w)-[r2:已连接到]-(此节点)(prog3)
将过滤器(程序在[prog1,prog2,prog3]中不为空的程序)作为progarray,将w.title作为title
作为程序展开(程序数组)
左侧(进度日期,3)+“0”为十年,计数(进度标题)为总计,标题
按十年、总描述、标题排序
以十年、头衔、总数、总人数(总计)作为绩效总计
十年,[集合中的标题(标题),其中总计=性能总计]作为标题,总计,性能总计
按性能订购Total DESC
返回十年,头(收集(性能总计))作为总计,头(收集(标题))作为标题
按十年排序;
其中最棘手的部分是,如果我们重用
prog
变量,它会将每个可选匹配的结果拖到下一个匹配中,基本上是尝试过滤,我们不会得到完全独立的路径。(为什么我们能够重用
w
,我现在有点难以理解……)不过这没关系。我们获取结果,将其放入数组,过滤空结果,然后将其放回包含所有有效结果的单个变量。在那之后,我们继续正常工作


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

您能发布一些示例数据、查询结果以及您的期望吗?特别是,我不明白为什么要对
程序
节点执行
[*..2]
。为什么不只是一个呢?它们之间有另一个节点用于性能本身,但我们对这个查询不感兴趣。这似乎是可行的。我必须根据原始数据进行验证,但这需要一段时间。非常感谢你。现在需要模糊搜索,因为我们仍在清理和合并数据,这是一个广泛的过程。当时的性能还不是问题。我是不是错过了一些很棒的东西!一开始我误读为“这似乎不起作用。”哈哈。如果程序和工作之间没有直接的联系,[*..2]是必要的。有一些方法可以限制它,如果你有其他你不希望它遵循的关系,我会编辑一下我的回答,看看我是否能给出一些例子。我非常感谢你的帮助。我最初是在初始条件下尝试限制1的技巧,然后,我希望我可以简单地使用极限5来展示前5名的表演,等等,但它从来没有像预期的那样工作。至于[*..2],我认为这意味着两边的节点最多有2个关系(它们是,模式中还有另一个节点)。我不明白“没有直达电话”的btw计划和工作。你是说一段感情吗?当我明确引用关系和中间节点,并删除标签时,它运行速度快了3倍:)谢谢!我很快就能打印出一些细节。不过,很高兴这一切都对你有用!我花了将近两个小时才弄明白,这是一个艰难的过程,但很有趣,我在这个过程中发现了一个bug!非常值得。
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
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;