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)
我不能在这里找到了问题。
谢谢!
那么,你可能在这里有一个数据建模问题。
您在创建单词节点时使用了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)
我只是想在给定的文字中使用的单词。非常感谢 –
谢谢澄清。我已经更新了我的答案。它应该将合并的单词保留在每个相关帖子的本地,并应简化分数计算。 – InverseFalcon
非常感谢你@InverseFalcon。我现在有了另一项任务,当我完成它时,我会回到这个。我会在稍后测试它 –
你能描述这是什么样的操作来支持?如果您希望实现快速文本搜索,查找和评分,那么已经设置了许多更好的工具来执行此操作,例如ElasticSearch。 – InverseFalcon
谢谢!我会看看这个 –
@InverseFalcon我读了关于ElasticSearch,我发现它不是我正在寻找的。谢啦! –