使用cypherquery仅在neo4j中查找具有多个传入关系的节点

时间:2015-06-30 12:48:35

标签: graph neo4j cypher

我有一个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;博士我不想看到只有一篇新闻文章指向他们的位置节点

3 个答案:

答案 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