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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow