Работа с Neo4j и Cypher с помощью Py2Neo

Введение

Примеры

  • 0

    Импорт и аутентификация

     from py2neo import authenticate, Graph, Node, Relationship
    authenticate("localhost:7474", "neo4j", "<pass>")
    graph = Graph()
    
     

    Вы должны убедиться, что база данных Neo4j существует по адресу localhost: 7474 с соответствующими учетными данными.

    graph объект является вашим интерфейсом к экземпляру Neo4j в остальной части коды питона. Скорее слава делает эту глобальную переменную, вы должны держать его в классе по __init__ методу.

  • 1

    Добавление узлов в график Neo4j

     results = News.objects.todays_news()
    for r in results:
        article = graph.merge_one("NewsArticle", "news_id", r)
        article.properties["title"] = results[r]['news_title']
        article.properties["timestamp"] = results[r]['news_timestamp']
        article.push()
        [...]
    
     

    Добавление узлов графа является довольно простым, graph.merge_one важен , так как он предотвращает повторяющиеся элементы. (Если запустить скрипт дважды, то во второй раз он обновит заголовок и не создаст новые узлы для тех же статей)

    timestamp должна быть целым числом , а не строка даты , как Neo4j реально не имеют даты тип данных. Это вызывает проблемы сортировки, когда вы сохраняете дату как '05 -06-1989'

    article.push() является вызовом , который фактически совершает операцию в Neo4j. Не забудьте этот шаг.

  • 0

    Добавление отношений в график Neo4j

     results = News.objects.todays_news()
    for r in results:
        article = graph.merge_one("NewsArticle", "news_id", r)
        if 'LOCATION' in results[r].keys():
            for loc in results[r]['LOCATION']:
                loc = graph.merge_one("Location", "name", loc)
                try:
                    rel = graph.create_unique(Relationship(article, "about_place", loc))
                except Exception, e:
                    print e
    
     

    create_unique важно для предотвращения дубликатов. Но в остальном это довольно простая операция. Имя отношения также важно, так как вы используете его в сложных случаях.

  • 0

    Запрос 1: Автозаполнение в заголовках новостей

     def get_autocomplete(text):
        query = """
        start n = node(*) where n.name =~ '(?i)%s.*' return n.name,labels(n) limit 10;
        """
        query = query % (text)
        obj = []
        for res in graph.cypher.execute(query):
            # print res[0],res[1]
            obj.append({'name':res[0],'entity_type':res[1]})
        return res
    
     

    Это образец монограмма запрос , чтобы получить все узлы с имуществом name , которое начинается с аргументом text .

  • 0

    Запрос 2: Получить статьи новостей по месту на определенную дату

     def search_news_by_entity(location,timestamp):
        query = """
        MATCH (n)-[]->(l) 
        where l.name='%s' and n.timestamp='%s'
        RETURN n.news_id limit 10
        """
    
        query = query % (location,timestamp)
    
        news_ids = []
        for res in graph.cypher.execute(query):
            news_ids.append(str(res[0]))
    
        return news_ids
    
     

    Вы можете использовать этот запрос , чтобы найти все статьи новостей (n) подключен к месту (l) отношения.

  • 0

    Cypher Query Samples

    Подсчет статей, связанных с конкретным человеком с течением времени

     MATCH (n)-[]->(l) 
    where l.name='Donald Trump'
    RETURN n.date,count(*) order by n.date
    
     

    Поиск других людей / мест, связанных с теми же новостными статьями, что и у Трампа, по крайней мере с 5 узлами общих отношений.

    MATCH (n:NewsArticle)-[]->(l)
    where l.name='Donald Trump'
    MATCH (n:NewsArticle)-[]->(m)
    with m,count(n) as num where num>5
    return labels(m)[0],(m.name), num order by num desc limit 10

Синтаксис

Параметры

Примечания