Как сделать так, чтобы запрос py2neo cypher принимал аргументы от python? - PullRequest
0 голосов
/ 23 декабря 2018

Общий фон
В настоящее время я пытаюсь записать запросы neo4j в функции, которые будут использоваться в колбе.
Я хочу, чтобы функция загружала данные из файла CSV, который обновляется сампериодически и создавать новые узлы и отношения по мере необходимости.После этого пользователи смогут вводить поисковые термины, относящиеся к названию своей статьи, и находить ключевые слова, относящиеся к их статье, с использованием метода сходства Jaccard.

Я пытался следовать приведенной здесь структуре функций:
https://github.com/nicolewhite/neo4j-flask/blob/master/blog/models.py

Я тестировал зашифрованные запросы neo4j отдельно, и в настоящее время я пытаюсь, чтобы py2neo использовал пользовательский ввод в качестве поискового запроса и добавлял в мой зашифрованный запрос поиск похожих слов.

Моя структура данных csv заголовка выглядит следующим образом:

title_id,title  
T1,ArticleTitle1  
T2,ArticleTitle2 

Файл csv моего ключевого слова выглядит следующим образом:

title_id,keyword_id,keyword  
T1,K1,aaa  
T1,K2,bbb  
T1,K3,ccc  
T1,K4,ddd  
T2,K1,aaa  
T2,K5,eee  
T2,K6,fff  
T2,K4,ddd  

В настоящее время мой код py2neo выглядит следующим образом:

from py2neo import Graph, Node, Relationship

from datetime import datetime
import os
import uuid

url = os.environ.get('GRAPHENEDB_URL', 'http://localhost:7474')

graph = Graph(url + '/db/data/', username="****", password="****")


class Keyword:    
    def jaccard_kw_rec(self, search):
        query2 = '''MATCH (p:Title)-[:SIMILAR]->(other),
                (other)-[:HAS_KEYWORDS]->(keyword)  
                WHERE not((p)-[:HAS_KEYWORDS]->(keyword)) and p.Title contains {self.search}
                RETURN keyword AS keywords
                '''
        return graph.run(query2)

Я скопировал форму функций, но после запуска с ошибками (python по-прежнему рассматривает мой запрос как просто строку), я немного растерялся относительно того, куда я должен идти дальше.

Большое спасибо,

Эрик

1 Ответ

0 голосов
/ 24 декабря 2018

Для моей конкретной проблемы я обнаружил, что у меня работает следующее:

def jacc_kw_rec(search):
    q_r = []
    query2 = "MATCH (p:Title)-[:SIMILAR]->(other), (other)-[:HAS_KEYWORDS]->(keyword) " \
             "WHERE not((p)-[:HAS_KEYWORDS]->(keyword)) and p.Title contains \"{}\"".format(
        search) + "RETURN keyword AS keywords LIMIT 3"

    result = graph.run(query2).data()
    for r in result:
        r_j = json.dumps(r)
        loaded_r = json.loads(r_j)
        kw_ex = loaded_r['keywords']['Keyword']
        q_r.append(kw_ex)
    return q_r

По сути, комбинация конкатенации строк и функции .format ().

...