Python Language
Neo4j e Cypher utilizzano Py2Neo
Ricerca…
Importare e autenticare
from py2neo import authenticate, Graph, Node, Relationship
authenticate("localhost:7474", "neo4j", "<pass>")
graph = Graph()
Devi assicurarti che il tuo database Neo4j esista su localhost: 7474 con le credenziali appropriate.
l'oggetto graph
è la tua interfaccia con l'istanza neo4j nel resto del tuo codice Python. Ringraziamo piuttosto rendendo questa variabile globale, dovresti tenerla nel metodo __init__
una classe.
Aggiunta di nodi al grafico 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'aggiunta di nodi al grafico è piuttosto semplice, graph.merge_one
è importante in quanto impedisce gli elementi duplicati. (Se si esegue lo script due volte, la seconda volta aggiorna il titolo e non crea nuovi nodi per gli stessi articoli)
timestamp
dovrebbe essere un numero intero e non una stringa di date dato che neo4j non ha realmente un datatype di data. Ciò causa problemi di ordinamento quando si memorizza la data come '05 -06-1989 '
article.push()
è una chiamata che in realtà commette l'operazione in neo4j. Non dimenticare questo passaggio.
Aggiunta di relazioni al grafico 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
è importante per evitare duplicati. Ma per il resto è un'operazione piuttosto semplice. Anche il nome della relazione è importante poiché lo si utilizzerà in casi avanzati.
Query 1: completamento automatico sui titoli di notizie
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
Questa è una query di esempio per ottenere tutti i nodi con il name
della proprietà che inizia con il text
dell'argomento.
Query 2: ottieni articoli di notizie per posizione in una data specifica
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
È possibile utilizzare questa query per trovare tutti gli articoli di notizie (n)
connessi a una posizione (l)
da una relazione.
Cypher Query Samples
Conta gli articoli collegati a una determinata persona nel tempo
MATCH (n)-[]->(l)
where l.name='Donald Trump'
RETURN n.date,count(*) order by n.date
Cerca altre persone / posizioni collegate agli stessi articoli di notizie di Trump con almeno 5 nodi di relazione totali.
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