2016-08-15 6 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, a, и, I, и т. д.), вероятно, будет иметь много [: NEXT] отношений, которые будут продолжать расти с каждым запросом.

Как вы это понимаете, так или иначе вы будете задавать свои вопросы о словах, используемых только в данном тексте в запросе?

EDIT

Проблема заключается в том слияние: узлы Word. Это будет соответствовать любому предыдущему: узлу 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. На данный момент у меня есть еще одна задача, и когда я закончу ее, я вернусь к этому. Я проверю его позже –