Neo4J查找节点之间的关系数(SIZE)

时间:2019-06-08 04:25:34

标签: neo4j numbers cypher relationship

我试图返回一组节点,其中有超过n种相同类型的传出关系。为特定的用例提供了一组电影,其中演员为其中一部电影做出了贡献。

我尝试了COUNTingSIZE的多种方法,但是无法弄清楚在Neo4J中这是否有可能

MATCH (cw:CreativeWork) WHERE cw.officialTitle IN ['Antz', 'The Specialist ']
MATCH (p:Person) WHERE SIZE((p)-[:contributedTo]-(cw)) > 1
RETURN p, cw

这将根据关系:contributedTo返回指定的两个Creative Works以及为标题贡献的所有人员。名单中的两个演员都为这两个奖项做出了贡献,我有兴趣只归还这两个。

enter image description here

例如,此查询不返回结果:

MATCH (cw:CreativeWork) WHERE cw.officialTitle IN ['Antz', 'The Specialist ']
MATCH (p:Person) WHERE SIZE((p)-[:contributedTo]-(cw)) > 1
RETURN p, cw

2 个答案:

答案 0 :(得分:0)

如果您的查询值SIZE()始终为 0 1 (除非任何一对{{ 1}}和Person)。这样做的原因是您的查询是在CreativeWorkSIZE上汇总Count(或Person)。(两者均与Group by相同)

您可以使用以下查询,其中每个CreativeWork COUNTS CreativeWorks(此查询返回CreativeWork for Person的列表。 ):

Person

您可以修改上面的查询,使其看起来很简单,如下所示(两者执行相同):

MATCH (cw:CreativeWork) WHERE cw.officialTitle IN ['Antz', 'The Specialist']
MATCH (p:Person)-[:contributedTo]-(cw)
WITH p,count(cw) as rels, collect(cw) as cws
WHERE rels > 1
RETURN p,cws
  

注意:列表中最后一个标题的末尾有一个空格(在   您的查询)。

答案 1 :(得分:0)

@Raj的最后一个查询可以简化:

MATCH (p:Person)-[:contributedTo]-(cw:CreativeWork)
WHERE cw.officialTitle IN ['Antz', 'The Specialist']
WITH p, collect(cw) as cws
WHERE SIZE(cws) > 1
RETURN p, cws