mysql - Neo4j:重写 UNION 的返回超出了应有的水平

标签 mysql neo4j cypher union

我正在将 MySQL 数据库迁移到 Neo4j 数据库,但我无法正确重写此查询。

MySQL 查询:

SELECT ID, Nome, Fotografia
    FROM Participante AS pa
    INNER JOIN Filme_temAtor_Participante AS fa ON fa.Participante_ID = pa.ID
    WHERE fa.Filme_ID = 1
UNION
SELECT ID, Nome, Fotografia
    FROM Participante AS pr
    INNER JOIN Filme_temRealizador_Participante AS fr ON fr.Participante_ID = pr.ID
    WHERE fr.Filme_ID = 1
ORDER BY Nome ASC;

从 SQL 到 Neo4j,我停止使用 ids 并开始使用名称本身。我进行了 2 个密码查询,第一个可以正常工作,但第二个不行:

第一个:

MATCH(f:Filme {Titulo: "Justice League"})
MATCH(a:Participante)<-[:TEM_ATOR]-(f)
MATCH(b:Participante)<-[:TEM_REALIZADOR]-(f)
RETURN a,b;

第二个:

MATCH(f:Filme {Titulo: "Justice League"})
MATCH(a:Participante)<-[:TEM_ATOR]-(f)
WITH COLLECT({Nome:a.Nome,Fotografia:a.Fotografia}) AS atores
MATCH(b:Participante)<-[:TEM_REALIZADOR]-(f)
WITH atores + COLLECT({Nome:b.Nome,Fotografia:b.Fotografia}) AS ps
UNWIND ps AS p
RETURN  p.Nome, p.Fotografia;

输出如下所示: output

由于该项目是葡萄牙语,我将提供相关单词的字典:

  • 参与者 -> 参与者
  • 电影 -> 电影
  • 摄影 -> 照片
  • temAtor -> hasActor
  • temRealizador -> hasDirector
  • 姓名 -> 姓名

任何帮助将不胜感激:)

最佳答案

您必须在 WITH 子句中传递 f:

MATCH(f:Filme {Titulo: "Justice League"})
MATCH(a:Participante)<-[:TEM_ATOR]-(f)
WITH f, COLLECT({Nome:a.Nome,Fotografia:a.Fotografia}) AS atores
MATCH(b:Participante)<-[:TEM_REALIZADOR]-(f)
WITH atores + COLLECT({Nome:b.Nome,Fotografia:b.Fotografia}) AS ps
UNWIND ps AS p
RETURN  p.Nome, p.Fotografia;

如果您不传递它,f 将被视为新变量,它可以绑定(bind)到任何节点,而不仅仅是正义联盟电影。

关于mysql - Neo4j:重写 UNION 的返回超出了应有的水平,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48252277/

相关文章:

mysql - 当在 mysql 中输入为 null 时,为 date_format 返回 null

java - Neo4j。迪克斯特拉。查找包含一组节点的路径 (graphalgo)

neo4j group by 和 sum 值

neo4j:具有最小关系属性方差的最短路径

mysql - 关于 MySQL 子总和

php - mysql where 子句中的 if 条件

Neo4j:检查路径中所有连续关系之间的条件

shell - 从 cypher neo4j-shell 向控制台输出状态消息

python - 优化 Python MySQL/连接器速度

intellij-idea - Spring Data Neo4j JUnit4设置