Python Language
Neo4j en Cypher met Py2Neo
Zoeken…
Importeren en verifiëren
from py2neo import authenticate, Graph, Node, Relationship
authenticate("localhost:7474", "neo4j", "<pass>")
graph = Graph()
U moet ervoor zorgen dat uw Neo4j-database bestaat op localhost: 7474 met de juiste inloggegevens.
de graph
object is uw interface naar de neo4j bijvoorbeeld in de rest van je python code. In plaats van dank te maken dat dit een globale variabele is, moet u het in de __init__
methode van een klas __init__
.
Knopen toevoegen aan Neo4j-grafiek
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()
[...]
graph.merge_one
aan de grafiek toevoegen is vrij eenvoudig, graph.merge_one
is belangrijk omdat het dubbele items voorkomt. (Als u het script twee keer uitvoert, wordt de titel de tweede keer bijgewerkt en worden er geen nieuwe knooppunten voor dezelfde artikelen gemaakt)
timestamp
moet een geheel getal zijn en geen datumreeks, omdat neo4j niet echt een datumgegevenstype heeft. Dit veroorzaakt sorteerproblemen wanneer u de datum opslaat als '05 -06-1989 '
article.push()
is een aanroep die de operatie daadwerkelijk in neo4j vastlegt. Vergeet deze stap niet.
Relaties toevoegen aan Neo4j Graph
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
is belangrijk om duplicaten te vermijden. Maar verder is het een vrij eenvoudige operatie. De relatienaam is ook belangrijk omdat u deze in geavanceerde gevallen zou gebruiken.
Vraag 1: Automatisch aanvullen op nieuwstitels
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
Dit is een voorbeeld Cypher query om alle knooppunten te krijgen met de eigenschap name
die begint met het argument text
.
Vraag 2: Ontvang nieuwsartikelen op locatie op een bepaalde datum
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
U kunt deze zoekopdracht gebruiken om alle nieuwsartikelen (n)
die door een relatie zijn verbonden met een locatie (l)
.
Cypher-queryvoorbeelden
Tel artikelen die in de loop van de tijd met een bepaalde persoon zijn verbonden
MATCH (n)-[]->(l)
where l.name='Donald Trump'
RETURN n.date,count(*) order by n.date
Zoek naar andere mensen / locaties die zijn verbonden met dezelfde nieuwsartikelen als Trump met ten minste 5 totale relatieknooppunten.
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