Datetime Neo4j-嵌套的FOREACH查询失败

Datetime Neo4j-嵌套的FOREACH查询失败,datetime,foreach,neo4j,cypher,Datetime,Foreach,Neo4j,Cypher,问题:Neo4j浏览器锁定执行查询…或返回未知错误。原因是第三个FOREACH在我下面的查询中,只有FOREACH定义不是MERGE/CREATE子句 我尝试进行一个密码查询,该查询将年的集合作为整数,并创建年/月/日节点。我试图通过使用collections/maps previor和嵌套的FOREACH子句来减少行数,这在创建天数的FOREACH之前效果良好 问题似乎在于使用映射的整数,如果我用普通整数替换m.num,它将处理天数,但只处理一个月(多次) 该查询基于Kenny Bastani

问题:Neo4j浏览器锁定
执行查询…
或返回
未知错误
。原因是第三个
FOREACH
在我下面的查询中,只有
FOREACH
定义不是
MERGE
/
CREATE
子句

我尝试进行一个密码查询,该查询将年的集合作为整数,并创建年/月/日节点。我试图通过使用collections/maps previor和嵌套的
FOREACH
子句来减少行数,这在创建天数的
FOREACH
之前效果良好

问题似乎在于使用映射的整数,如果我用普通整数替换
m.num
,它将处理天数,但只处理一个月(多次)

该查询基于Kenny Bastani的查询:

我还将
CREATE
更改为
CREATE UNIQUE
,这样可以防止类似于
MERGE
的重复关系/节点

我应该以不同的方式编写查询吗?我曾经有过一次较旧版本的查询工作,但后来锁定在localhost和grapheneDB上执行查询。当初始测试查询(年份:
19992000200420102400
)在grapheneDB上运行时,它返回:

添加1755个标签,创建1755个节点,设置5195个属性,创建1800个关系,在20049毫秒内返回0行

这是合理的时间吗?是否会因为使用GrapheneDB和256mb RAM而变慢?或者通过将密码减少到嵌套查询和集合/映射中,我是否使查询效率低下

我的问题是:

//Date ranges in a month
WITH 
    range(1, 28) as Days_28, 
    range(1, 29) as Days_29, 
    range(1, 30) as Days_30, 
    range(1, 31) as Days_31

//Assign months date ranges
WITH 
    Days_31 as January, 
    Days_28 as February, 
    Days_29 as Leap_February, 
    Days_31 as March, 
    Days_30 as April, 
    Days_31 as May, 
    Days_30 as June,
    Days_31 as July, 
    Days_31 as August, 
    Days_30 as September, 
    Days_31 as October, 
    Days_30 as November, 
    Days_31 as December

//Mapping months to days keys - num key could be avoided by changing FOREACH to: 'FOREACH(m IN range(1,length(year.months)) |' or 'FOREACH(m IN range(1, 12) |'
WITH [
    {num: 1, days: January}, 
    {num: 2, days: February}, 
    {num: 3, days: March}, 
    {num: 4, days: April}, 
    {num: 5, days: May}, 
    {num: 6, days: June}, 
    {num: 7, days: July}, 
    {num: 8, days: August}, 
    {num: 9, days: September}, 
    {num: 10, days: October}, 
    {num: 11, days: November}, 
    {num: 12, days: December}
    ] as regular_year, Leap_February

//Create leap year
WITH [regular_year[0] , {num: 2, days: Leap_February} , regular_year[2..11]] AS leap_year, regular_year

//Years to create are stored in years collection - anyway to move this to the top without having to add it to the end of every WITH clause prior?
WITH [1996] as years,leap_year,regular_year
//Check if year is a leap year, if so map to leap_year, if not map regular_year
WITH [year IN years | CASE WHEN (year%4=0 AND NOT year%100=0) THEN {year:year, months:leap_year} WHEN (year%4=0 AND year%100=0 AND year%400=0) THEN {year:year, months:leap_year} ELSE {year:year, months:regular_year} END] AS yearMap

//Create nodes/relationships for years/months/days
FOREACH(year IN yearMap |
    MERGE (thisYear: Year {year: year.year})

    FOREACH(m IN year.months |
        MERGE (thisMonth :Month { month: m.num, year: year.year })
        CREATE UNIQUE (thisYear)-[:HAS_MONTH]->(thisMonth)

        MERGE (firstDay :Day { day: 1, month: m.num, year: year.year })
        CREATE UNIQUE (thisMonth)-[:FIRST]->(firstDay)

        //This FOREACH line is causing a problem, if replace m.num with an integer value it works, but then only processes that month
        FOREACH (d IN TAIL((year.months[m.num]).days) |
            MERGE (thisDay: Day { day: d, month: m.num, year: year.year })
            MERGE (lastDay: Day { day: d - 1, month: m.num, year: year.year })
            CREATE UNIQUE(lastDay)-[:NEXT]->(thisDay)
        )

    MERGE (lastDay: Day { day: last((year.months[m.num]).days), month: m.num, year: year.year })
    CREATE UNIQUE (thisMonth)-[:LAST]->(lastDay)
    )
)
更新:我发现了一些错误。从我的第一个查询版本开始,我改变了创建闰年集合的方式。正常年份的查询工作做得很好,但闰年刚刚中断。这是因为对正常年份[2..11]的误解,我原以为它会分割[2]-[11],但是第二个整数是一个上限?将其更改为12将添加所有剩余月份。该方法还使闰年的长度由12变为3,我们将行改为:
使用[regular_year[0],{num:2,days:Leap_Juner}]+过滤器(regular_year中的月份,其中month.num>2)作为Leap_year,regular_year

我挑选的第二个问题是在第三个
FOREACH
中,我使用的是
(年.月[m.num])。天
,在那里我应该有m.num-1来正确访问集合,最后一个
合并
。然而,对于闰年来说,这个查询仍然是错误的

更新2: 我想我在编辑中列出的修复已经完成了。在我的localhostDB中,除了我测试的那一年(2000年),所有的年份似乎都很好,我用一个类似的闰年(2400年)进行了检查,结果成功了

我试图在grapheneDB中的数据库上进行查询,但出现以下错误:
模式(本月)-[1469:
FIRST
]->(firstDay)产生了多个可能的路径,这是不允许的

它所指的代码片段是:

FOREACH(m IN year.months |
 MERGE (thisMonth:Month { month: m.num, year: year.year })
 CREATE UNIQUE (thisYear)-[:HAS_MONTH]->(thisMonth)

 MERGE (firstDay:Day { day: 1, month: m.num, year: year.year })
 CREATE UNIQUE (thisMonth)-[:FIRST]->(firstDay)

我一直在grapheneDB的数据库中处理这个查询,创建了一个新的数据库,使用这个查询,一切都很好,甚至在2000年。大约用了4000毫秒,然后我尝试了一个混合了常规/闰年的查询,总共6年。它无法完成查询,但存在大量节点。在一年内(现有或未存在)再次使用查询失败。我的查询一定是以某种方式破坏了数据库?

我和graphenedb的人谈过:

一个是免费的沙箱实例,内存、cpu和执行时间都有一定的资源限制。如果其中一个数据库超出了进一步的限制并且没有恢复,它将重新启动

他们还说,如果您在graphenedb上遇到问题,应该联系他们的支持人员。
或者,如果您使用heroku插件,请通过heroku支持系统进行操作。

我只是想知道为什么您要在cypher查询中而不是在服务器端脚本语言中进行日、月和年的映射。我的想法是什么,从php的角度来说,在几年内获取一系列日期并循环创建节点会更容易。刚试过,1500.000个节点到公元前2100年都没有问题。Sotiris,我使用的语言没有支持Neo4j的lib/driver,还有我以前从未使用过的REST支持,它只支持GET和POST。我一直在使用Cypher来玩Neo4j,并习惯了它以及如何使用Cypher。我了解到Cypher不适合广泛使用地图/集合,我会用编程语言解决如何使用Cypher而不是REST。我注意到当查询出错时,我无法重置数据库,我必须等待一定时间才能再次访问数据库,这就解释了:)我在这里问,因为我认为这与我的查询有关,而不是GrapheneDB。后来有人指出,这是嵌套FOREACH子句中的MERGE错误,在2.0.1中修复。