【问题标题】:Neo4j Cypher: Find common nodes between a set of matched nodesNeo4j Cypher:查找一组匹配节点之间的公共节点
【发布时间】:2017-01-04 21:15:16
【问题描述】:

here发布的问题非常相似

我有以下节点:文章和单词。每个词都通过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

但不适用于一个单词列表。我怎样才能让它处理任意数量的单词?有没有更好的方法来做到这一点?

【问题讨论】:

    标签: database graph neo4j cypher


    【解决方案1】:

    是的。我可以想到两种方法:

    1. 查找包含这些词的某个子集的所有文章,然后仅返回提及的词数是您在词表中提供的词数的文章。

    2. 获取给定单词列表的 :Word 节点,然后获取文章中提及所有单词的文章。

    这是一个用于测试的示例图表:

    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)
    

    方法一,比较wordlist的大小和文章中提到的字数,看起来是这样的:

    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 与其中的每一个一起使用,以确定哪个最适合您的数据集。

    【讨论】:

      猜你喜欢
      • 2021-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-04
      • 1970-01-01
      相关资源
      最近更新 更多