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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow