Cypher查询返回不良结果

问题描述:

我需要获取文本并将它们保存到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,我发现它不是我正在寻找的。谢啦! –

那么,你可能在这里有一个数据建模问题。

您在创建单词节点时使用了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。我现在有了另一项任务,当我完成它时,我会回到这个。我会在稍后测试它 –