首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Neo4j/Cypher中高效地找到连接两组节点的唯一中间节点

在Neo4j/Cypher中高效地找到连接两组节点的唯一中间节点
EN

Stack Overflow用户
提问于 2021-05-06 23:49:51
回答 1查看 37关注 0票数 0

我有关于电影的数据,可以是喜剧,也可以是电视剧。我在这些电影中有演员,他们可以在每部电影中扮演多个角色。我想要找到所有不同的电影和演员的场景:

(剧集1:电影类型{ {Genre:'Drama'})-role1-(actor1:Actor)-role2-(comedy:Movie {Genre:'Comedy'})-role3-(actor2:Actor)-role4-(drama2:Movie:‘话剧’})

也就是说,我想找出两部(不同)电视剧通过一部喜剧联系在一起的地方,这两部电视剧至少有一个演员。我正在努力有效地做到这一点,并让neo4j为我提供不同的drama1,drama2,actor1,actor2,comedy组。我的数据有几百万个节点和数千万个关系,所以效率很重要。可以插入neo4j在线控制台的玩具设置是:

(j)-:ActedIn->(b),(j)-:ActedIn->(c),(k)-:ActedIn->(d),(l)-:ActedIn->(c),(i)-:ActedIn->(a),(i)-:ActedIn->(h),(m)-:ActedIn->(h)

我主要尝试了各种不同的

匹配(戏剧1:电影类型{ {Genre:'Drama'})-role1-(actor1:Actor)-role2-(comedy:Movie {Genre:'Comedy'})-role3-(actor2:Actor)-role4-(drama2:Movie:‘戏剧’})返回drama1,actor1,actor1,actor2,drama2

EN

回答 1

Stack Overflow用户

发布于 2021-05-07 00:27:35

您可以像这样使用多匹配查询:

代码语言:javascript
复制
MATCH p = (drama1:Movie {Genre:'Drama'})-[r1]-(a1)-[r2]-(comedy:Movie {Genre:'Comedy'})-[r3]-(a2)-[r4]-(drama2:Movie {Genre:'Drama'})
MATCH (drama1)-[]-(a:Actor)-[]-(drama2) 
WHERE drama1<>drama2 
RETURN nodes(p)

查询说明:

第一个匹配查找由喜剧连接的2个戏剧

  • 第二个匹配告诉这两个戏剧必须由同一个演员连接

  • WHERE子句指示这2个戏剧必须是different

  • RETURN子句返回模式

不需要做太多的工作来优化查询,因为您没有按任何属性进行过滤,所以您将遍历整个图。您可以尝试在'Genre‘属性上创建索引,但如果您只有两个不同的值,则不建议这样做。

代码语言:javascript
复制
MATCH p = (drama1:Movie {Genre:'Drama'})-[r1]-(a1)-[r2]-(comedy:Movie {Genre:'Comedy'})-[r3]-(a2)-[r4]-(drama2:Movie {Genre:'Drama'})
MATCH (drama1)-[]-(a:Actor)-[]-(drama2) 
WHERE drama1<>drama2 
RETURN nodes(p) SKIP 0 LIMIT 100000

此查询获取前100k个模式,然后您必须递增跳过以获得下一个100k (跳过100000限制100000)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67421668

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档