繁体   English   中英

无法过滤密码查询Neo4j上的节点

[英]Can't filter nodes on cypher query Neo4j

我有一些数据,如下所示:

(:Artist {id: 1, name: "Depeche Mode"})<-[:PLAYED_BY]-(:Song {id: 1, title: "Enjoy The Silence"})-[:PLAYED_BY]->(:Artist {id: 2, name: "Lacuna Coil"})

例如,我将需要查询id 1和2的所有PLAYED_BY Artist Song

我在想类似的东西:

MATCH (s:Song)-[:PLAYED_BY]->(a:Artist)
WHERE a.id IN [1, 2]
RETURN s

但这不是我想要的那样工作:因为它就像一个OR ,我想像AND使用它。

有什么建议么?

编辑1: Artist的数量应该是任意的。

EDIT2:我还需要使用全文索引运行此查询,如下所示:

START song=node:node_auto_index("title:*enjo*") 
MATCH ... 
RETURN ...

该歌曲也由其他艺术家播放,例如,由Artist [1, 2, 3]播放的Song 1 当我查询[1,2] ,无论如何应该返回它。

这应该适用于您的示例:

MATCH (a1:Artist)<-[:PLAYED_BY]-(s:Song)-[:PLAYED_BY]->(a2:Artist)
WHERE a1.id = 1 AND a2.id = 2
RETURN s

因此,您想查找歌手1和歌手2播放的歌曲吗?

该查询如何:

MATCH (a1:Artist)<-[:PLAYED_BY]-(s:Song)-[:PLAYED_BY]->(a2:Artist)
WHERE a1.id = 1 AND a2.id = 2
RETURN s

编辑

对于任意数量的艺术家:

WITH [1,2] AS ids
MATCH (a:Artist)<-[:PLAYED_BY]-(s:Song)
WITH collect(a.id) AS artistIds, ids,s
WHERE all(x IN artistIds WHERE x IN ids) AND all(x IN ids WHERE x IN artistIds)
RETURN s

收集播放过歌曲的所有艺术家的ID,然后使用Cypher集合谓词all仅过滤所需的艺术家ID。

数组[1,2]可以像这样被参数化: WITH {id_array} AS ids ...

编辑

使用旧式索引进行模糊文本搜索应适用于这种方法。 只需将MATCH中未绑定(s:Song)模式的部分替换为由旧索引填充的绑定song变量:

START song=node:node_auto_index("title:*enjo*")
WITH [1,2] AS ids, song
MATCH (a:Artist)<-[:PLAYED_BY]-(song)
WITH collect(a.id) AS artistIds, ids, song
WHERE all(x IN artistIds WHERE x IN ids) AND all(x IN ids WHERE x IN artistIds)
RETURN s

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM