Python Language
Neo4j et Cypher utilisant Py2Neo
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