Python Language
Neo4j und Cypher mit Py2Neo
Suche…
Importieren und Authentifizieren
from py2neo import authenticate, Graph, Node, Relationship
authenticate("localhost:7474", "neo4j", "<pass>")
graph = Graph()
Sie müssen sicherstellen, dass Ihre Neo4j-Datenbank unter localhost: 7474 mit den entsprechenden Anmeldeinformationen vorhanden ist.
Das graph
ist Ihre Schnittstelle zur neo4j-Instanz im Rest Ihres Python-Codes. Danken Sie es nicht, diese Variable zu einer globalen Variablen zu __init__
.
Knoten zum Neo4j-Diagramm hinzufügen
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()
[...]
Das Hinzufügen von Knoten zum Diagramm ist ziemlich einfach. graph.merge_one
ist wichtig, da doppelte Elemente graph.merge_one
werden. (Wenn Sie das Skript zweimal ausführen, wird der Titel beim zweiten Mal aktualisiert, und es werden keine neuen Knoten für dieselben Artikel erstellt.)
timestamp
sollte eine Ganzzahl und keine Datumszeichenfolge sein, da neo4j nicht wirklich einen Datumsdatentyp hat. Dies führt zu Sortierproblemen, wenn Sie das Datum als '05 -06-1989 'speichern.
article.push()
ist der Aufruf, der die Operation tatsächlich in neo4j festschreibt. Vergiss diesen Schritt nicht.
Hinzufügen von Beziehungen zum Neo4j-Diagramm
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
ist wichtig, um Duplikate zu vermeiden. Aber sonst ist es eine ziemlich unkomplizierte Operation. Der Beziehungsname ist auch wichtig, da Sie ihn in fortgeschrittenen Fällen verwenden würden.
Abfrage 1: Autovervollständigung bei Nachrichtentiteln
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
Dies ist ein Beispiel Chiffre Abfrage alle Knoten mit der Eigenschaft zu erhalten name
, die mit dem Argument beginnt text
.
Abfrage 2: Abrufen von Nachrichtenartikeln an einem bestimmten Datum nach Standort
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
Sie können diese Abfrage verwenden, um alle Nachrichtenartikel (n)
zu finden, die durch eine Beziehung mit einem Ort (l)
.
Cypher Query Samples
Zählen Sie Artikel, die im Laufe der Zeit mit einer bestimmten Person verbunden sind
MATCH (n)-[]->(l)
where l.name='Donald Trump'
RETURN n.date,count(*) order by n.date
Suchen Sie nach anderen Personen / Orten, die mit den gleichen Nachrichtenartikeln wie Trump verbunden sind, mit insgesamt mindestens fünf Beziehungsknoten.
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