我有一个neo4j数据库用于学习这种新的图形技术,我按照这种结构制作了节点
(n:NewsArticle) -[r:about_place]-> (l:Location)
现在我想要的是稍微复杂/错综复杂(或者我似乎认为是这样)并且对cypher来说是新手,我无法用这种新语法完全表达自己。请耐心等待。
基本上我的文章标记了很多地方。现在,在某一天,我发现了所有标有特定位置的文章。一旦我拥有它们,现在对于这些文章,我想找出它们被标记的其他位置。
这段代码似乎做了我想要的。 (yaay)
MATCH (n:NewsArticle{date:"Jun-30-2015"})-[]->(l:Location{name:"India"})
MATCH (n:NewsArticle)-[r:about_place]->(m:Location)
return n,m
此时我最终获得了8个地点和132篇新闻文章。
现在为Tricky部分。我拥有的132篇文章中的大部分都是关于8个位置中只有1个的about_place关系, 我不想要这个。我想在这个集合中找到与我找到的至少2个地点有关系的文章。
我提出了这个问题,
MATCH (n:NewsArticle{date:"Jun-30-2015"})-[]->(l:Location{name:"India"})
MATCH (n:NewsArticle)-[r:about_place]->(m:Location)
WITH m, count(r) as rel_cnt
WHERE rel_cnt > 2
MATCH (a:NewsArticle{date:"Jun-30-2015"})-[r:about_place]->(m:Location)
return a,m
它确实给了我一些结果,但它没有做我想要的。但是,如果我将 a 更改为 n (以引用前2个匹配语句)它会变成语法错误,但我觉得它应该给我我想要的结果
tl;博士我不想看到只有一篇新闻文章指向他们的位置节点
答案 0 :(得分:2)
This query should return all the NewsArticle
nodes with the date
property of "Jun-30-2015" that have an :about_place
relationship with Location
India and at least one other location:
MATCH (n:NewsArticle {date:"Jun-30-2015"})-[:about_place]->(:Location {name: "India"})
MATCH (n)-[r:about_place]->(l:Location)
WITH collect(n) AS articles, l, count(r) AS num WHERE num > 2
RETURN l, articles, num
答案 1 :(得分:0)
尝试:
MATCH (n:NewsArticle {date:"Jun-30-2015"})-[:about_place]->(:Location {name: "India"})
MATCH (n)-[r:about_place]->(l:Location)
WITH n, count(r) as num
WHERE num > 2
MATCH (n)-[:about_place]->(l:Location)
RETURN n, l
您可能希望从结果中排除原始位置,因为您需要在最终RETURN之前添加其他过滤器。
答案 2 :(得分:0)
找到了答案作为collect()语句,它允许你通过WITH管道携带变量。
MATCH (n:NewsArticle{date:"Jun-30-2015"})-[:about_place]->(l:Location{name:"India"})
MATCH (n:NewsArticle)-[r:about_place]->(loc:Location)
WITH loc,collect(n) as article, count(r) as num WHERE num > 2
RETURN loc,article