2016-07-13 1 views
1

J'essaye d'importer un fichier JSON obtenu via une requête API vers StackOverflow vers NEO4J. J'ai suivi ce tutorial. Cependant, je reçois des erreurs comme suit en essayant d'exécuter la requête:Importer JSON à NEO4J en utilisant py2neo

File "/Users/ahmedov/anaconda/lib/python2.7/site-packages/py2neo/cypher/core.py", line 306, in commit 
    return self.post(self.__commit or self.__begin_commit) 

    File "/Users/ahmedov/anaconda/lib/python2.7/site-packages/py2neo/cypher/core.py", line 261, in post 
    raise self.error_class.hydrate(error) 

    File "/Users/ahmedov/anaconda/lib/python2.7/site-packages/py2neo/cypher/error/core.py", line 54, in hydrate 
    error_cls = getattr(error_module, title) 

AttributeError: 'module' object has no attribute 'SyntaxError' 

J'utilise le code suivant:

import os 
import requests 
from py2neo import neo4j 
from py2neo import Graph 

from py2neo import Path, authenticate 
# set up authentication parameters 
authenticate("localhost:7474", "neo4j", "neo4j") 

# connect to authenticated graph database 
#graph = Graph("http://localhost:7474/db/data/") 

# Connect to graph and add constraints. 
neo4jUrl = os.environ.get('NEO4J_URL',"http://localhost:7474/db/data/") 
graph = neo4j.Graph(neo4jUrl) 

# Connect to graph and add constraints. 
#neo4jUrl = os.environ.get('NEO4J_URL',"http://localhost:7474/db/data/") 
#graph = neo4j.GraphDatabaseService(neo4jUrl) 

# Add uniqueness constraints. 
graph.cypher.execute("CREATE CONSTRAINT ON (q:Question) ASSERT q.id IS UNIQUE;") 
# Build URL. 
apiUrl ="https://api.stackexchange.com/2.2/questions?pagesize=100&order=desc&sort=creation&tagged=neo4j&site=stackoverflow&filter=!5-i6Zw8Y)4W7vpy91PMYsKM-k9yzEsSC1_Uxlf" 
# Send GET request. 
json = requests.get(apiUrl, headers = {"accept":"application/json"}).json() 

# Build query. 
query = """ 
UNWIND data.items as q 
MERGE (question:Question {id:q.question_id}) ON CREATE 
    SET question.title = q.title, question.share_link = q.share_link, question.favorite_count = q.favorite_count 

MERGE (owner:User {id:q.owner.user_id}) ON CREATE SET owner.display_name = q.owner.display_name 
MERGE (owner)-[:ASKED]->(question) 

FOREACH (tagName IN q.tags | MERGE (tag:Tag {name:tagName}) MERGE (question)-[:TAGGED]->(tag)) 
FOREACH (a IN q.answers | 
    MERGE (question)<-[:ANSWERS]-(answer:Answer {id:a.answer_id}) 
    MERGE (answerer:User {id:a.owner.user_id}) ON CREATE SET answerer.display_name = a.owner.display_name 
    MERGE (answer)<-[:PROVIDED]-(answerer) 
) 

""" 
statement = "MERGE (n:Person {name:{N}}) RETURN n" 
results = graph.cypher.run(query,json=json) 

tx = graph.cypher.begin() 

def add_names(*names): 
    for name in names: 
     tx.append(statement, {"N": name}) 
    tx.process() 

add_names("Homer", "Marge", "Bart", "Lisa", "Maggie") 
add_names("Peter", "Lois", "Chris", "Meg", "Stewie") 
tx.append(query,) 
tx.commit() 
# Send Cypher query. 

Le problème provient de la ligne suivante:

results = graph.cypher.run(query,json=json) 

J'ai dû changer la ligne ci-dessus pour l'ajuster à la plus récente api py2neo. La ligne originale ressemblait à ceci:

neo4j.CypherQuery(graph, query).run(json=json) 

Donc, fondamentalement, je dois trouver un moyen de dire Neo4j que je dois traiter le fichier JSON en utilisant la requête donnée. J'ai essayé de lire le documentaire et de chercher sur le web sans aucune chance. Toute aide serait appréciée.

Répondre

4

Un couple de choses à faire votre travail de script:

from py2neo import neo4j n'est pas une dépendance plus valide

Dans votre requête, vous passez une carte JSON comme paramètre, mais ne pas utiliser la syntaxe des paramètres la requête, j'ai ajouté WITH {json} as data au début de la requête.

Ajouté secure=False pour la connexion

La dernière tx.append(query,) n'est pas nécessaire.

scénario de travail:

import os 
import requests 
#from py2neo import neo4j 
from py2neo import Graph 
from py2neo import Path, authenticate 
# set up authentication parameters 
authenticate("localhost:7474", "neo4j", "neo4j") 

# connect to authenticated graph database 
#graph = Graph("http://localhost:7474/db/data/") 

# Connect to graph and add constraints. 
neo4jUrl = os.environ.get('NEO4J_URL',"http://localhost:7474/db/data/") 
graph = Graph(neo4jUrl,secure=False) 

# Connect to graph and add constraints. 
#neo4jUrl = os.environ.get('NEO4J_URL',"http://localhost:7474/db/data/") 
#graph = neo4j.GraphDatabaseService(neo4jUrl) 

# Add uniqueness constraints. 
graph.run("CREATE CONSTRAINT ON (q:Question) ASSERT q.id IS UNIQUE;") 
# Build URL. 
apiUrl ="https://api.stackexchange.com/2.2/questions?pagesize=100&order=desc&sort=creation&tagged=neo4j&site=stackoverflow&filter=!5-i6Zw8Y)4W7vpy91PMYsKM-k9yzEsSC1_Uxlf" 
# Send GET request. 
json = requests.get(apiUrl, headers = {"accept":"application/json"}).json() 

#print(json); 

# Build query. 
query = """ 
WITH {json} as data 
UNWIND data.items as q 
MERGE (question:Question {id:q.question_id}) ON CREATE 
    SET question.title = q.title, question.share_link = q.share_link, question.favorite_count = q.favorite_count 

MERGE (owner:User {id:q.owner.user_id}) ON CREATE SET owner.display_name = q.owner.display_name 
MERGE (owner)-[:ASKED]->(question) 

FOREACH (tagName IN q.tags | MERGE (tag:Tag {name:tagName}) MERGE (question)-[:TAGGED]->(tag)) 
FOREACH (a IN q.answers | 
    MERGE (question)<-[:ANSWERS]-(answer:Answer {id:a.answer_id}) 
    MERGE (answerer:User {id:a.owner.user_id}) ON CREATE SET answerer.display_name = a.owner.display_name 
    MERGE (answer)<-[:PROVIDED]-(answerer) 
) 

""" 
statement = "MERGE (n:Person {name:{N}}) RETURN n" 
results = graph.run(query,json=json) 

tx = graph.begin() 

def add_names(*names): 
    for name in names: 
     tx.append(statement, {"N": name}) 
    tx.process() 

add_names("Homer", "Marge", "Bart", "Lisa", "Maggie") 
add_names("Peter", "Lois", "Chris", "Meg", "Stewie") 
#tx.append(query,) 
tx.commit() 

Résultat:

enter image description here

+0

Je reçois encore quelques erreurs: Fichier "/Users/ahmedov/neo4j.py", ligne 14, en graph = Graph (neo4jUrl, secure = False) TypeError: __new __() a un argument de mot clé inattendu 'secure' puis, si je supprime secure = false, je reçois: Fichier "/Users/ahmedov/neo4j.py", ligne 21, en graph.run ("CREER CONTRAINT ON (q: Question) ASSERT q.id EST UNIQUE; ") AttributeError: l'objet 'Graph' n'a pas d'attribut 'run' – Ahmedov

+1

il semble que vous avez une incompatibilité de versions py2neo, pouvez-vous exécuter' pip installer py2neo --upgrade' –

+0

Merci! finalement, ça marche. Il est maintenant temps de résoudre un problème similaire pour le pilote Java :) – Ahmedov