Python Language
Neo4j i Cypher za pomocą Py2Neo
Szukaj…
Importowanie i uwierzytelnianie
from py2neo import authenticate, Graph, Node, Relationship
authenticate("localhost:7474", "neo4j", "<pass>")
graph = Graph()
Musisz upewnić się, że baza danych Neo4j istnieje na localhost: 7474 z odpowiednimi poświadczeniami.
obiekt graph
jest interfejsem do instancji neo4j w pozostałej części kodu Pythona. Raczej dzięki uczynieniu z tej zmiennej globalnej powinieneś zachować ją w klasie __init__
.
Dodawanie węzłów do wykresu 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()
[...]
Dodawanie węzłów do wykresu jest dość proste, graph.merge_one
jest ważny, ponieważ zapobiega duplikowaniu elementów. (Jeśli uruchomisz skrypt dwa razy, to po raz drugi zaktualizuje tytuł i nie utworzy nowych węzłów dla tych samych artykułów)
timestamp
powinien być liczbą całkowitą, a nie ciągiem daty, ponieważ neo4j tak naprawdę nie ma typu danych daty. Powoduje to problemy z sortowaniem podczas przechowywania daty jako „05 -06-1989”
article.push()
to wywołanie, które faktycznie zatwierdza operację w neo4j. Nie zapomnij o tym kroku.
Dodawanie relacji do wykresu 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
jest ważny dla uniknięcia duplikatów. Ale poza tym jest to dość prosta operacja. Nazwa relacji jest również ważna, ponieważ można jej używać w zaawansowanych przypadkach.
Zapytanie 1: Autouzupełnianie w tytułach wiadomości
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
To jest przykładowe zapytanie szyfrujące, aby uzyskać wszystkie węzły o name
właściwości rozpoczynającej się od text
argumentu.
Zapytanie 2: Otrzymuj artykuły z wiadomościami według lokalizacji w określonym dniu
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
Możesz użyć tego zapytania, aby znaleźć wszystkie artykuły (n)
związane z lokalizacją (l)
relacją.
Próbki zapytania Cypher
Zliczaj artykuły związane z określoną osobą w czasie
MATCH (n)-[]->(l)
where l.name='Donald Trump'
RETURN n.date,count(*) order by n.date
Wyszukaj inne osoby / lokalizacje związane z tymi samymi artykułami prasowymi co Trump z co najmniej 5 węzłami relacji.
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