简体   繁体   中英

Neo4J find the the number(SIZE) of relationships between nodes

I am trying to return a set of nodes where there is more than n outgoing relationships of the same kind. The specific use case is given a set of movies which actors have contributed to more than one of those movies.

I have tried multiple methods of COUNTing and SIZE , but cannot figure out whether this is even possible in Neo4J

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

This will return the two Creative Works specified and all the people who have contributed to the title, based on the relationship :contributedTo . Two actors in the list have contributed to both titles, and I am interested in returning just those two.

在此处输入图片说明

This query for example returns no results:

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

In case of your query value of SIZE() will be always 0 or 1 (Except if there are two or more relationships between any pair of Person and CreativeWork ). The reason for this is your query is aggregating the SIZE (or Count ) over Person and CreativeWork .(Same as Group by on both of these)

You can use the following query which COUNTS CreativeWorks for each Person (This query returns a list of CreativeWork for 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

You can modify the above query to look simple as follows(Both performs the same):

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

NOTE: There is a space at the end of the last title in the list (in your query).

@Raj's last query can be simplified:

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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