Python Language
Neo4j och Cypher med Py2Neo
Sök…
Import och autentisering
from py2neo import authenticate, Graph, Node, Relationship
authenticate("localhost:7474", "neo4j", "<pass>")
graph = Graph()
Du måste se till att din Neo4j-databas finns på localhost: 7474 med rätt referenser.
graph
är ditt gränssnitt till neo4j-instansen i resten av din pythonkod. Tacka snarare för att göra detta till en global variabel, du bör hålla den i klassens __init__
metod.
Lägga till noder till Neo4j-graf
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()
[...]
Att lägga till noder i diagrammet är ganska enkelt, graph.merge_one
är viktigt eftersom det förhindrar dubbla objekt. (Om du kör skriptet två gånger, uppdaterar det andra gången titeln och skapar inte nya noder för samma artiklar)
timestamp
bör vara ett heltal och inte en datumsträng eftersom neo4j egentligen inte har en datumdatatyp. Detta orsakar sorteringsproblem när du lagrar datum som '05 -06-1989 '
article.push()
är ett samtal som faktiskt förbinder operationen till neo4j. Glöm inte detta steg.
Lägga till relationer till Neo4j-graf
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
är viktigt för att undvika duplikat. Men annars är det en ganska enkel operation. Relationsnamnet är också viktigt eftersom du skulle använda det i avancerade fall.
Fråga 1: Autofyll i nyhetstitlar
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
Detta är ett urval cypher fråga för att få alla noder med fastigheten name
som börjar med argumentet text
.
Fråga 2: Hämta nyhetsartiklar efter plats på ett visst 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
Du kan använda den här frågan för att hitta alla nyhetsartiklar (n)
anslutna till en plats (l)
genom en relation.
Cypher Query-prov
Räkna artiklar som är anslutna till en viss person över tid
MATCH (n)-[]->(l)
where l.name='Donald Trump'
RETURN n.date,count(*) order by n.date
Sök efter andra personer / platser som är kopplade till samma nyhetsartiklar som Trump med minst 5 totala förhållande noder.
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