【问题标题】:ORDER BY before a Collect and With在收集和使用之前订购
【发布时间】:2015-10-19 18:37:59
【问题描述】:

我有一个大型 Cypher 查询,我在其中收集了许多信息,以便在我的应用程序中查看。一方面,我使用 OPTIONAL MATCH 来获得即将举行的聚会,但我需要在他们进入 COLLECT 并通过 WITH 语句传递之前由 ASC 订购它们。我试图将它添加到 WHERE 子句下方,显然它会引发错误。

有没有办法在 OPTIONAL MATCH 或 COLLECT 语句中进行排序?

这是我的 Cypher 查询

MATCH (o:Person)<-[:OWNED_BY]-(g:Group {group_slug:"'.$group_slug.'"})<-[:MEMBER_OF]-(m:Person)-[:JOB_TITLE]->(title:Title)
WITH o,g,COLLECT({first_name: m.first_name, last_name: m.last_name, image_name: m.image_name, username: m.username, job_title: title.job_title}) as members,title,COUNT(m) as member_count
OPTIONAL MATCH (g)-[:TOPIC_OF]->(t:Topic)
WITH o,members,g,COLLECT(DISTINCT t.name) as topics,title,member_count
OPTIONAL MATCH (g)-[:CREATED]->(mu:Meetup{status:"Active"})-[:MEETUP_AT]->(l:Location)
WHERE toInt(mu.meet_date) >= '.time().'
WITH o,members,g,title,topics,COLLECT({location_name:l.location_name, address:l.address,city:l.city,state:l.state,zip_code:l.zip_code,meet_date:mu.meet_date,meeting_id:id(mu)}) as meetups,member_count
OPTIONAL MATCH (g)-[]->(amu:Meetup)
WITH o,members,g,title,topics,meetups,COUNT(amu) as meetup_count,member_count
OPTIONAL MATCH (g)<-[:REQUESTED]-(pm:Person)-[:JOB_TITLE]->(pmt:Title)
WITH o,members,g,title,topics,meetups,meetup_count,COLLECT({first_name: pm.first_name, last_name: pm.last_name, image_name: pm.image_name, username: pm.username, job_title: pmt.job_title}) as requested,member_count
OPTIONAL MATCH(g) <-[:FAVORITED]-(fp:Person)
WITH o,members,g,title,topics,meetups,meetup_count,requested,COUNT(fp) as favorited,member_count
RETURN o.username as owner_username, o.first_name as owner_first, o.last_name as owner_last, g.group_name as group_name, g.description as description, g.access as access, g.group_slug as group_slug,
topics, members,meetups,meetup_count, favorited,requested,member_count

有问题的查询部分在哪里

OPTIONAL MATCH (g)-[:CREATED]->(mu:Meetup{status:"Active"})-[:MEETUP_AT]->(l:Location)
WHERE toInt(mu.meet_date) >= time()

【问题讨论】:

  • 错误信息是什么?另外,请注意时间戳函数是timestamp() 而不是time()
  • time() 是 PHP。抱歉,我没有指定

标签: php neo4j cypher


【解决方案1】:

[已编辑]

WITH 子句后面可以跟 ORDER BYSKIPLIMIT 子句。

这个查询对你有用吗?

WITH timestamp() AS now
MATCH (o:Person)<-[:OWNED_BY]-(g:Group {group_slug:"'.$group_slug.'"})<-[:MEMBER_OF]-(m:Person)-[:JOB_TITLE]->(title:Title)
WITH o,g,COLLECT({first_name: m.first_name, last_name: m.last_name, image_name: m.image_name, username: m.username, job_title: title.job_title}) as members,title,COUNT(m) as member_count
OPTIONAL MATCH (g)-[:TOPIC_OF]->(t:Topic)
WITH o,members,g,COLLECT(DISTINCT t.name) as topics,title,member_count
OPTIONAL MATCH (g)-[:CREATED]->(mu:Meetup{status:"Active"})-[:MEETUP_AT]->(l:Location)
WHERE mu.meet_date >= now
WITH o,members,g,topics,title,member_count,mu,l
ORDER BY mu.meet_date
WITH o,members,g,title,topics,COLLECT({location_name:l.location_name, address:l.address,city:l.city,state:l.state,zip_code:l.zip_code,meet_date:mu.meet_date,meeting_id:id(mu)}) as meetups,member_count
OPTIONAL MATCH (g)-[]->(amu:Meetup)
WITH o,members,g,title,topics,meetups,COUNT(amu) as meetup_count,member_count
OPTIONAL MATCH (g)<-[:REQUESTED]-(pm:Person)-[:JOB_TITLE]->(pmt:Title)
WITH o,members,g,title,topics,meetups,meetup_count,COLLECT({first_name: pm.first_name, last_name: pm.last_name, image_name: pm.image_name, username: pm.username, job_title: pmt.job_title}) as requested,member_count
OPTIONAL MATCH(g) <-[:FAVORITED]-(fp:Person)
WITH o,members,g,title,topics,meetups,meetup_count,requested,COUNT(fp) as favorited,member_count
RETURN o.username as owner_username, o.first_name as owner_first, o.last_name as owner_last, g.group_name as group_name, g.description as description, g.access as access, g.group_slug as group_slug,
topics, members,meetups,meetup_count, favorited,requested,member_count;

为了效率,我们先创建一个now变量,而不是每次需要时都重新计算当前时间。这也将确保一致的结果:

WITH timestamp() AS now

“违规”查询部分中的WHERE 子句已替换为:

WHERE mu.meet_date >= now
WITH o,members,g,topics,title,member_count,mu,l
ORDER BY mu.meet_date

【讨论】:

  • 订单现在有效,但我仍然只能提取大于或等于今天的日期吗?
猜你喜欢
  • 2014-04-23
  • 1970-01-01
  • 2017-12-13
  • 1970-01-01
  • 2012-09-21
  • 2018-08-10
  • 2013-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多