为了与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)不支持现在还没有的特性。
有人知道如何重写查询吗?
干杯。
发布于 2015-09-10 10:20:57
我不清楚您到底想要做什么,但是通常您可以通过使用UNION来划分查询来避免使用WITH。只需确保收集第一个子查询的所有结果,以便在第二个子查询开始时只有一个结果项(否则第二个子查询将对每个结果项运行一次)。
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对,在这种情况下,您可以执行以下操作
MATCH (p:Person), (q:Person)
WHERE p-[:FRIEND_OF]->q OR p<-[:COMPOSED_BY]-(:SchoolClass)-[:COMPOSED_BY]->(q)
RETURN p.town, q.town我希望我没有完全误解。
https://stackoverflow.com/questions/32498110
复制相似问题