首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >具有相似属性的Neo4j匹配节点(数组)

具有相似属性的Neo4j匹配节点(数组)
EN

Stack Overflow用户
提问于 2017-05-01 13:09:05
回答 1查看 66关注 0票数 1

我有一个具有属性的电影节点,例如:类型、作者、语言(字符串数组)。

我想得到所有具有相似数组属性的节点,以及相似度百分比。

例如,对于类型属性:

电影1:犯罪,戏剧,神秘

电影2:戏剧

33%的相似性

此外

此外,我还需要一个查询,返回至少有一种常见类型作者(语言)的所有电影。

我知道我必须使用collect函数,但是我如何比较数组

例如:电影1:犯罪,戏剧,神秘

电影2:犯罪,密斯特

电影3:迷幻药,喜剧

电影4:喜剧

第一组:电影1,Movie2,Movie3

第2组:电影3,Movie4

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-01 13:51:59

您可以使用REDUCE来计算交叉口:

代码语言:javascript
复制
WITH 
  ['Drama','Crime','Mystery'] as genre1,
  ['Drama'] as genre2
WITH
  genre1, 
  genre2,
  CASE WHEN size(genre1)>size(genre2) 
       THEN size(genre1) 
       ELSE size(genre2)
  END as maxSize, 
  REDUCE(acc=0, 
         genre in genre1 
         | acc + CASE WHEN genre in genre2 THEN 1 ELSE 0 END
  ) as similarity
RETURN genre1, 
       genre2, 
       100.0 * similarity / maxSize as similarity

或者您可以从apoc.coll.intersection中使用APOC library函数

代码语言:javascript
复制
WITH 
  ['Drama','Crime','Mystery'] as genre1,
  ['Drama'] as genre2
WITH
  genre1, 
  genre2,
  apoc.coll.max([size(genre1), size(genre2)]) as maxSize,
  apoc.coll.intersection(genre1, genre2) as similarity
RETURN genre1, 
       genre2, 
       100.0 * size(similarity) / maxSize as similarity

如果您只想找到至少有一种类型相交的节点:

代码语言:javascript
复制
MATCH (M:Movie)
UNWIND M.genres as genre
WITH genre, 
     M
     ORDER BY id(M) ASC
WITH genre, 
     collect(M) as movies
RETURN distinct movies as movies
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43719610

复制
相关文章

相似问题

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