簡體   English   中英

Neo4j Cypher:在一組匹配的節點之間查找公共節點

[英]Neo4j Cypher: Find common nodes between a set of matched nodes

此處發布的問題非常相似

我有以下節點:文章和單詞。 每個單詞都通過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

但不適用於一個單詞列表。 如何使其處理任意數量的單詞? 有一個更好的方法嗎?

是。 我可以想到兩種方法:

  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)

方法1,將詞表大小與文章中提到的詞數進行比較,如下所示:

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與每個參數一起使用,以確定哪種方法最適合您的數據集。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM