Neo4j 可以合并这两个查询

Neo4j 可以合并这两个查询,neo4j,cypher,Neo4j,Cypher,我有两个cypher问题,想知道是否有可能在一份声明中获得积分和猎头信息 MATCH (s:SEASON)-[*]->(e:EVENT)<-[f:FINISHED]-(p:PLAYER) WHERE s.id = 8 AND e.id <= 1197 RETURN p, sum(f.points) AS Points ORDER BY Points DESC MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIM

我有两个cypher问题,想知道是否有可能在一份声明中获得积分和猎头信息

MATCH (s:SEASON)-[*]->(e:EVENT)<-[f:FINISHED]-(p:PLAYER)
    WHERE s.id = 8 AND e.id <= 1197
    RETURN p, sum(f.points) AS Points
    ORDER BY Points DESC

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER)
    WHERE s.id = 8 AND e.id <= 1197
    RETURN p, sum(el.points) AS HeadHunter
    ORDER BY HeadHunter DESC
我尝试了不同的方法,但没有一种有效。我想这样做:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER),(e)<-[f:FINISHED]-(p)
    WHERE s.id = 8 AND e.id <= 1197
    RETURN p, sum(el.points) AS HeadHunter, sum(f.points) AS Points

原则上,我认为您的查询可以工作,但您可能在使用p变量时犯了错误。在此查询中:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER),(e)<-[f:FINISHED]-(p)
    WHERE s.id = 8 AND e.id <= 1197
    RETURN p, sum(el.points) AS HeadHunter, sum(f.points) AS Points

注意,对于pElim和pFinish的各种组合,您将有许多额外的输出行,但各自的值应该是正确的。

原则上,我认为您的查询可以工作,但您可能在使用p变量时犯了错误。在此查询中:

MATCH (s:SEASON)-[*]->(e:EVENT)<-[el:ELIMINATED]-(p:PLAYER),(e)<-[f:FINISHED]-(p)
    WHERE s.id = 8 AND e.id <= 1197
    RETURN p, sum(el.points) AS HeadHunter, sum(f.points) AS Points

注意:对于pElim和pFinish的各种组合,您将有很多额外的输出行,但各自的值应该是正确的。

这对您有用吗

MATCH (s:SEASON)-[*]->(e:EVENT)<-[rel:FINISHED|ELIMINATED]-(p:PLAYER)
WHERE s.id = 8 AND e.id <= 1197
WITH p, COLLECT(rel) AS rels
RETURN p,
  REDUCE(s = 0, x IN rels | CASE WHEN TYPE(x) = 'FINISHED' THEN s + x.points ELSE s END) AS Points,
  REDUCE(s = 0, x IN rels | CASE WHEN TYPE(x) = 'ELIMINATED' THEN s + x.points ELSE s END) AS HeadHunter

这应该返回每个完成和/或被淘汰的球员的相关金额。

这对你有用吗

MATCH (s:SEASON)-[*]->(e:EVENT)<-[rel:FINISHED|ELIMINATED]-(p:PLAYER)
WHERE s.id = 8 AND e.id <= 1197
WITH p, COLLECT(rel) AS rels
RETURN p,
  REDUCE(s = 0, x IN rels | CASE WHEN TYPE(x) = 'FINISHED' THEN s + x.points ELSE s END) AS Points,
  REDUCE(s = 0, x IN rels | CASE WHEN TYPE(x) = 'ELIMINATED' THEN s + x.points ELSE s END) AS HeadHunter

这将返回每个已完成和/或已被淘汰的玩家的相关总和。

此查询仅匹配具有已淘汰关系和已完成关系的事件。虽然比原来的查询好,但这可能仍然不合适。啊,那么OP也在寻找事件对象的独立性?原始问题中的实际模型需求有点模糊。如果我对我的用例和节点是如何“逻辑”连接的有点不清楚,那么@frobberoffits很抱歉。我对所有图形数据库的东西都相当陌生,可能必须弄清楚哪些信息与问我的问题相关,这是无误的。此查询只匹配具有消除关系和完成关系的事件。虽然比原来的查询好,但这可能仍然不合适。啊,那么OP也在寻找事件对象的独立性?原始问题中的实际模型需求有点模糊。如果我对我的用例和节点是如何“逻辑”连接的有点不清楚,那么@frobberoffits很抱歉。我对所有图形数据库的东西都是相当陌生的,可能必须弄清楚哪些信息与问我的问题相关,这是毫无疑问的。看起来很有希望。今天晚些时候我会尝试这个解决方案,如果它按预期工作,我会给你一个反馈。看起来很有希望。今天晚些时候我会尝试这个解决方案,如果它按预期工作,我会给你一个反馈。