Neo4J聚合计数是全局的,而不是每个子图

时间:2019-11-28 18:15:13

标签: neo4j cypher

(概念上)这是我的数据模型:

(Person)-[:SEEN_AT_EVENT]->(Event)

数据:

CREATE (john:Person {name: 'John Smith'})
CREATE (jane:Person {name: 'Jane Smith'})
CREATE (a:Event {name: "Event A"})
CREATE (b:Event {name: "Event B"})
CREATE (c:Event {name: "Event C"})
CREATE (john)-[:SEEN_AT]->(a)
CREATE (john)-[:SEEN_AT]->(b)
CREATE (john)-[:SEEN_AT]->(c)
CREATE (jane)-[:SEEN_AT]->(a)
CREATE (jane)-[:SEEN_AT]->(b)
CREATE (jane)-[:SEEN_AT]->(c)

以及一些示例:

"John Smith" seen at event "Event A"
"John Smith" seen at event "Event B"
"John Smith" seen at event "Event C"
"Jane Smith" seen at event "Event A"
"Jane Smith" seen at event "Event B"
"Jane Smith" seen at event "Event C"

我想找出被一起看过两次以上的人,并检索关系中的“人”和“事件”节点。

MATCH (p:Person)-[rel1:SEEN_AT]->(e:Event)<-[rel2:SEEN_AT]-(p1:Person) 
WITH p, rel1, e, rel2, p1, count(e) AS total_events_together 
RETURN  p, rel1, e, rel2, p1, total_events_together

(如预期的那样)向我显示了约翰和简之间的各个路径(子图)。该计数是每个子图(为1)。

我想使用此计数作为过滤路径的谓词(我认为这意味着该计数应全局应用(在图级别而不是子图级别)?

1 个答案:

答案 0 :(得分:1)

在一个ID大于另一个ID的事件中,您可以计算每对人员的事件,因此您不会重复计算。将事件和每个关系收集在一个单独的对象中,而不仅仅是获得计数。使用集合的大小可以仅获取大于两个的联合事件。

MATCH (p:Person)-[rel1:SEEN_AT]->(e:Event)<-[rel2:SEEN_AT]-(p1:Person) 
WHERE id(p) > id(p1)
WITH p, p1, collect( {event: e, rel1: rel1, rel2: rel2}) AS total_events_together
WHERE size (total_events_together) > 2
RETURN p, p1, total_events_together