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

用户名

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

(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)。

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

戴夫·贝内特

您可以在一个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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章