首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >neo4j规避联盟上的聚合

neo4j规避联盟上的聚合
EN

Stack Overflow用户
提问于 2015-09-10 09:31:35
回答 1查看 89关注 0票数 3

为了与Cypher一起练习一下,我举了一个简单的例子,让学生成为参加某些课程的其他学生的朋友。

现在我想了解班级如何为不同城镇的朋友交友做贡献,所以,我需要计算出有多少来自不同城镇的学生因为友谊或者因为他们上同一堂课而相遇。

通常情况下,我会通过计算每对(p1.town,p2.town)的出现来对以下联合的结果进行汇总。MATCH (p1: Person) -[:FRIEND_OF]-> (p2: Person) WHERE p1.id <> p2.id AND p1.town <> p2.town RETURN p1.town, p2.town UNION ALL MATCH (q1: Person) <-[:COMPOSED_BY]- (:SchoolClass) -[:COMPOSED_BY]-> (q2: Person) WHERE q1.id <> q2.id AND q1.town <> q2.town RETURN p1.town, p2.town,但不幸的是,通过联合聚合是Neo4J (和Cypher)不支持现在还没有的特性。

有人知道如何重写查询吗?

干杯。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-10 10:20:57

我不清楚您到底想要做什么,但是通常您可以通过使用UNION来划分查询来避免使用WITH。只需确保收集第一个子查询的所有结果,以便在第二个子查询开始时只有一个结果项(否则第二个子查询将对每个结果项运行一次)。

代码语言:javascript
运行
复制
MATCH (p1:Person)-[:FRIEND_OF]->(p2:Person)
WHERE p1.id <> p2.id                        // Necessary? Are your :Persons friends with themselves?
AND p1.town <> p2.town
WITH COLLECT([p1.town, p2.town]) as friendTownPairs
MATCH (q1:Person)<-[:COMPOSED_BY]-(:SchoolClass)-[:COMPOSED_BY]->(q2:Person)
WHERE q1.id <> q2.id                        // Again, probably not necessary, unless a :SchoolClass can have two :COMPOSED_BY relationships to the same :Person
AND q1.town <> q2.town
RETURN COLLECT([p1.town, p2.town]) as classmateTownPairs

就像我说的,我不知道你想对结果做什么计算。如果你能够在工会上聚集,它会是什么样子?看起来,您希望为任何两个朋友或同校班级的人(这两个查询的联合)获取person.town对,在这种情况下,您可以执行以下操作

代码语言:javascript
运行
复制
MATCH (p:Person), (q:Person)
WHERE p-[:FRIEND_OF]->q OR p<-[:COMPOSED_BY]-(:SchoolClass)-[:COMPOSED_BY]->(q)
RETURN p.town, q.town

我希望我没有完全误解。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32498110

复制
相关文章

相似问题

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