Recherche…


Importation et authentification

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

Vous devez vous assurer que votre base de données Neo4j existe sur localhost: 7474 avec les informations d'identification appropriées.

L'objet graph est votre interface avec l'instance neo4j dans le reste de votre code python. Merci de faire de cette variable une variable globale, vous devriez la garder dans la méthode __init__ une classe.

Ajout de nœuds au graphique 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()
    [...]

L'ajout de nœuds au graphique est assez simple, graph.merge_one est important car il évite les doublons. (Si vous exécutez le script deux fois, la deuxième fois, il mettra à jour le titre et ne créera pas de nouveaux nœuds pour les mêmes articles)

timestamp devrait être un entier et non une chaîne de date car neo4j n'a pas vraiment de type de données de date. Cela provoque des problèmes de tri lorsque vous stockez la date sous la forme '05 -06-1989 '

article.push() est l'appel qui valide effectivement l'opération dans neo4j. N'oubliez pas cette étape.

Ajout de relations au graphique 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 est important pour éviter les doublons. Mais sinon c'est une opération assez simple. Le nom de la relation est également important car vous l'utiliseriez dans les cas avancés.

Requête 1: saisie semi-automatique sur les titres d'actualités

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

Ceci est un exemple de requête cryptage pour obtenir tous les nœuds avec le name la propriété qui commence par le text l'argument.

Requête 2: Obtenir des articles par lieu à une date donnée

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

Vous pouvez utiliser cette requête pour rechercher tous les articles (n) connectés à un emplacement (l) par une relation.

Échantillons d'interrogation

Compter les articles connectés à une personne en particulier au fil du temps

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

Recherchez d'autres personnes / emplacements connectés aux mêmes articles d'actualité que Trump avec au moins 5 nœuds de relation au total.

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


Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow