本文介绍了Neo4j Cypher:查找一组匹配节点之间的公共节点的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我有以下节点:文章和单词.每个单词都通过 MENTIONED
关系与文章相关联.
我需要查询所有包含常用词的文章,其中常用词列表是动态的.从客户的角度来看,我正在传递一个单词列表,并期望返回具有这些单词的文章的结果.
WITH ["orange", "apple"] as words
MATCH (w:Word)<-[:MENTIONED]-(a:Article)-[:MENTIONED]->(w2:Word)
WHERE w.name IN words AND w2.name IN words
RETURN a, w, w2
但不适用于单词列表之一.我怎样才能让它处理任意数量的单词?有没有更好的方法来做到这一点?
推荐答案
Yes. There are two approaches I can think of:
获取给定单词列表的 :Word 节点,然后获取文章中提及所有单词的文章.
Here's an example graph to test this on:
MERGE (a1:Article {name:'a1'}),
(a2:Article {name:'a2'}),
(a3:Article {name:'a3'})
MERGE (w1:Word{name:'orange'}),
(w2:Word{name:'apple'}),
(w3:Word{name:'pineapple'}),
(w4:Word{name:'banana'})
MERGE (a1)-[:MENTIONED]->(w1),
(a1)-[:MENTIONED]->(w2),
(a1)-[:MENTIONED]->(w3),
(a1)-[:MENTIONED]->(w4),
(a2)-[:MENTIONED]->(w1),
(a2)-[:MENTIONED]->(w4),
(a3)-[:MENTIONED]->(w1),
(a3)-[:MENTIONED]->(w2),
(a3)-[:MENTIONED]->(w3)
WITH ["orange", "apple"] as words
MATCH (word:Word)<-[:MENTIONED]-(article:Article)
WHERE word.name IN words
WITH words, article, COUNT(word) as wordCount
WHERE wordCount = SIZE(words)
RETURN article
这仅在文章和提及的词之间只有一个 :MENTIONED 关系时才有效,无论该词被提及多少次.
方法 2 对 :Words 的集合使用 ALL() 以确保我们匹配提及所有单词的文章:
WITH ["orange", "apple"] as words
MATCH (word:Word)
WHERE word.name in words
WITH COLLECT(word) as words
MATCH (article:Article)
WHERE ALL (word in words WHERE (word)<-[:MENTIONED]-(article))
RETURN article
您可以尝试将 PROFILE 与其中的每一个一起使用,以确定哪个最适合您的数据集.
You can try using PROFILE with each of these to figure out which works best with your data set.
这篇关于Neo4j Cypher:查找一组匹配节点之间的公共节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!