2016-07-13 16 views
1

Ich versuche, eine JSON-Datei zu importieren, die durch eine API-Anforderung an StackOverflow zu NEO4J erhalten wurde. Ich habe diese tutorial verfolgt. Allerdings bekomme ich Fehler wie die folgenden bei dem Versuch, die Abfrage auszuführen:Importieren von JSON zu NEO4J mit 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' 

ich den folgenden Code verwenden:

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. 

Das Problem aus der folgenden Zeile stammt:

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

Ich musste die obige Zeile ändern, um sie an die neuere py2neo API anzupassen. Die ursprüngliche Linie sah wie folgt aus:

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

Also im Grunde, ich brauche einen Weg zu finden, Neo4j zu sagen, dass ich brauche die JSON-Datei mit dem angegebenen Abfrage zu verarbeiten. Ich habe versucht, den Dokumentarfilm zu lesen und ohne Erfolg im Internet zu suchen. Jede Hilfe wäre willkommen.

Antwort

4

Ein paar Dinge, die Ihr Skript funktioniert:

from py2neo import neo4j ist keine gültige Abhängigkeit mehr

In Ihrer Anfrage, übergeben Sie eine json Karte als Parameter, aber Sie die Parameter Syntax nicht in Verwendung die Abfrage, ich habe WITH {json} as data am Anfang der Abfrage hinzugefügt.

Added secure=False für die Verbindung

Die letzte tx.append(query,) ist nicht erforderlich.

Arbeits Skript:

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() 

Ergebnis:

enter image description here

+0

ich immer noch ein paar Fehler: File "/Users/ahmedov/neo4j.py", Zeile 14, in graph = Graph (neo4jUrl, secure = False) TypeError: __neu __() hat ein unerwartetes Schlüsselwort argument 'secure' erhalten Wenn ich dann secure = false entferne, bekomme ich: Datei "/Users/ahmedov/neo4j.py", Zeile 21, in graph.run ("CREATE CONSTRAINT ON (q: Frage) ASSERT q.id IST UNIQUE; ") AttributError: 'Graph' Objekt hat kein Attribut 'run' – Ahmedov

+1

es scheint, Sie haben ein Missverhältnis von py2neo Versionen, können Sie' pip installieren py2neo --upgrade' –

+0

Thanks! endlich hat es funktioniert. Jetzt ist es an der Zeit, ein ähnliches Problem für den Java-Treiber zu lösen :) – Ahmedov