2016-08-15 86 views
0

我需要獲取文本並將它們保存到Neo4j。之後,我將該文本的每個單詞分隔開來,並在它們之間創建一個[:NEXT]關係,以指示在另一個之後出現的單詞和指示該文本包含該單詞的[:CONTAINS]關係。 最後,我嘗試在文本中找到具有更多關係[:NEXT]但不包含在整個數據庫中的單詞。只在給定的文本中。Cypher查詢返回不良結果

不幸的是我只是得到了整個數據庫的總和。

查詢是:

query = ''' 
     WITH split("%s"," ") as words 
     MERGE (p:Post {id: '%s', text: '%s'}) 
     WITH p, words 
     UNWIND range(0,size(words)-2) as idx 
     MERGE (w1:Word {name:words[idx]}) 
     MERGE (w2:Word {name:words[idx+1]}) 
     MERGE (w1)-[:NEXT]->(w2) 
     MERGE (p)-[:CONTAINS]->(w2) 
     MERGE (p)-[:CONTAINS]->(w1) 
     WITH p 
     MATCH (p)-[c:CONTAINS]->(w:Word) 
     MATCH()-[n1:NEXT]->(:Word {name: w.name})<-[:CONTAINS]-(p) 
     MATCH (p)-[:CONTAINS]-(:Word {name: w.name})-[n2:NEXT]->() 
     WITH COUNT(n1) + COUNT(n2)AS score, w.name AS word, p.text AS post, p.id AS _id 
     RETURN post, word, score, _id; 
     ''' %(text, id, text) 

我不能在這裏找到了問題。

謝謝!

+0

你能描述這是什麼樣的操作來支持?如果您希望實現快速文本搜索,查找和評分,那麼已經設置了許多更好的工具來執行此操作,例如ElasticSearch。 – InverseFalcon

+0

謝謝!我會看看這個 –

+0

@InverseFalcon我讀了關於ElasticSearch,我發現它不是我正在尋找的。謝啦! –

回答

0

那麼,你可能在這裏有一個數據建模問題。

您在創建單詞節點時使用了MERGE,因此如果該單詞是從任何先前帶有文本的查詢中添加的,則它將重用該同一節點,所以更常見的單詞節點(a,the,and,I,等等)可能會有許多[:NEXT]關係,每個查詢都會繼續增長。

這是你的意思,這是你的行爲,還是你只會問你的分貝關於在查詢中給定的文本中使用的單詞問題?

編輯

問題是合併:Word節點。這將匹配任何先前的查詢:根據任何以前的查詢創建的字節點,並將與任何未來的查詢匹配。合併Word節點本身是不夠的。爲了讓您的話語只針對每個相關帖子,您必須同時合併帖子中單詞的關係。因爲我們需要的是每個單詞的任何方向的[:NEXT]關係的數量,所以我們可以清理用於匹配以計算單詞分數的模式。

query = ''' 
    WITH split("%s"," ") as words 
    MERGE (p:Post {id: '%s', text: '%s'}) 
    WITH p, words 
    UNWIND range(0,size(words)-2) as idx 
    MERGE (p)-[:CONTAINS]->(w1:Word {name:words[idx]}) 
    MERGE (p)-[:CONTAINS]->(w2:Word {name:words[idx+1]}) 
    MERGE (w1)-[:NEXT]->(w2) 
    WITH p 
    MATCH (p)-[:CONTAINS]->(w:Word) 
    WITH size(()-[:NEXT]-(w)) AS score, w.name AS word, p.text AS post, p.id AS _id 
    RETURN post, word, score, _id; 
    ''' %(text, id, text) 
+0

我只是想在給定的文字中使用的單詞。非常感謝 –

+0

謝謝澄清。我已經更新了我的答案。它應該將合併的單詞保留在每個相關帖子的本地,並應簡化分數計算。 – InverseFalcon

+0

非常感謝你@InverseFalcon。我現在有了另一項任務,當我完成它時,我會回到這個。我會在稍後測試它 –