Buscar..


Importación y Autenticación

from py2neo import authenticate, Graph, Node, Relationship
authenticate("localhost:7474", "neo4j", "<pass>")
graph = Graph()

Debe asegurarse de que su base de datos Neo4j existe en localhost: 7474 con las credenciales apropiadas.

El objeto graph es su interfaz con la instancia de neo4j en el resto de su código de Python. Más bien, gracias a hacer de esto una variable global, debes mantenerla en el método __init__ una clase.

Añadiendo nodos a Neo4j Graph

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()
    [...]

Agregar nodos a la gráfica es bastante simple, graph.merge_one es importante ya que evita elementos duplicados. (Si ejecuta el script dos veces, la segunda vez se actualizará el título y no se crearán nuevos nodos para los mismos artículos)

timestamp debe ser un número entero y no una cadena de fecha, ya que neo4j realmente no tiene un tipo de datos de fecha. Esto causa problemas de clasificación cuando almacena la fecha como '05 -06-1989 '

article.push() es una llamada que realmente realiza la operación en neo4j. No olvides este paso.

Agregando relaciones a 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 es importante para evitar duplicados. Pero por lo demás es una operación bastante sencilla. El nombre de la relación también es importante, ya que lo usaría en casos avanzados.

Consulta 1: Autocompletar en títulos de noticias

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

Esta es una consulta de ejemplo para obtener todos los nodos con el name la propiedad que comienza con el text argumento.

Consulta 2: obtener artículos de noticias por ubicación en una fecha en particular

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

Puede usar esta consulta para encontrar todos los artículos de noticias (n) conectados a una ubicación (l) por una relación.

Cypher Query Samples

Contar artículos conectados a una persona en particular a lo largo del tiempo.

MATCH (n)-[]->(l) 
where l.name='Donald Trump'
RETURN n.date,count(*) order by n.date

Busque otras personas / ubicaciones conectadas a los mismos artículos de noticias que Trump con al menos 5 nodos de relaciones totales.

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow