2016-07-13 4 views
0

Ich versuche, Knoten und Kanten mit Python für einige Chemikalien und die damit verbundene Reaktionen in Neo4j zu erzeugen, aber ein Problem mit Knoten/Beziehung Schaffung bin schlagen ...Programatically Kanten in Neo4j mit Python zu schaffen

Mein Code .. .

from neo4j.v1 import GraphDatabase, basic_auth 

driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "password")) 
session = driver.session() 

def addReactionNeo4j(reagents, products, reaction): 
    cypher = "CREATE (%s:Reaction {RXNid:\"%s\", name:\"%s\"})" % (reaction[0],reaction[1],reaction[2]) 
    session.run(cypher) 
    print cypher 

    for reagent in reagents: 
     cypher = "CREATE (%s:Molecule {CHMid: \"%s\", smiles:\"%s\"})" % (reagent[0], reagent[1], reagent[2]) 
     session.run(cypher) 
     print cypher 
     cypher = "CREATE (%s)-[:REAGENT]->(%s)" %(reagent[0], reaction[0]) 
     print cypher 
     session.run(cypher) 

    for product in products:    
     cypher = "CREATE (%s:Molecule {CHMid: \"%s\", smiles:\"%s\"})" % (product[0], product[1], product[2]) 
     session.run(cypher) 
     print cypher 
     cypher = "CREATE (%s)-[:PRODUCT]->(%s)" %(reaction[0], product[0]) 
     session.run(cypher) 
     print cypher 

reagents1 = [] 
reagents1.append(["Chem2","nbutylamine","CCCCN"]) 
reagents1.append(["Chem3","butanoicAcid","CCCCOO"]) 

products1 =[] 
products1.append(["Chem1","Nbutylbutanamide","CCCCNC(O)CCCC"]) 

reaction1 = ["Reaction1", "reaction1", "AmideFormation"] 

addReactionNeo4j(reagents1, products1, reaction1) 


session.close() 

Dieser Code sollte Cypher-Code schreiben und in Neo4j ausführen.

Es gibt folgende Chiffre-Code als Ausgangs

CREATE (Reaction1:Reaction {RXNid:"reaction1", name:"AmideFormation"}) 
CREATE (Chem2:Molecule {CHMid: "nbutylamine", smiles:"CCCCN"}) 
CREATE (Chem2)-[:REAGENT]->(Reaction1) 
CREATE (Chem3:Molecule {CHMid: "butanoicAcid", smiles:"CCCCOO"}) 
CREATE (Chem3)-[:REAGENT]->(Reaction1) 
CREATE (Chem1:Molecule {CHMid: "Nbutylbutanamide ", smiles:"CCCCNC(O)CCCC"}) 
CREATE (Reaction1)-[:PRODUCT]->(Chem1) 

Dieser Code funktioniert wie wenn sie in Neo4j eingefügt erwartet

enter image description here

Aber wenn ich sehe die durch den Code erstellt Graphen (die in Theorie sollte den gleichen Cypher-Code ausführen) Ich bekomme die Knoten erstellt, aber es hat Probleme, die Knoten mit Kanten zu verbinden - die Knoten nicht verbunden zu lassen.

enter image description here

Kann jemand mir sagen, was ich falsch mache?

Dank

Chris

Antwort

0

Ich habe eine Lösung.

Es scheint, wenn in Neo4j I

CREATE (Reaction1:Reaction {RXNid:"reaction1", name:"AmideFormation"}) 
CREATE (Chem2:Molecule {CHMid: "nbutylamine", smiles:"CCCCN"}) 
CREATE (Chem3:Molecule {CHMid: "butanoicAcid", smiles:"CCCCOO"}) 
CREATE (Chem1:Molecule {CHMid: "Nbutylbutanamide", smiles:"CCCCNC(O)CCCC"}) 

laufen und dann laufen ...

CREATE (Chem2)-[:REAGENT]->(Reaction1) 
CREATE (Chem3)-[:REAGENT]->(Reaction1) 
CREATE (Reaction1)-[:PRODUCT]->(Chem1) 

ich die Probleme mit Verbindungsknoten replizieren kann. Aber wenn ich sie gleichzeitig führe, ist alles in Ordnung.

ändern daher meinen Code MATCH zu verwenden und statt einfach erstellen bekommt runden das Problem MERGE ....

from neo4j.v1 import GraphDatabase, basic_auth 

driver = GraphDatabase.driver("bolt://localhost", auth=basic_auth("neo4j", "arthuc01")) 
session = driver.session() 


def addReactionNeo4j(reagents, products, reaction): 
    reagents = reagents1 
    products = products1 
    reaction = reaction1 

    cypher = "MERGE (%s:Reaction {RXNid:\"%s\", name:\"%s\"})" % (reaction[0],reaction[1],reaction[2]) 
    session.run(cypher) 
    print cypher 

    for reagent in reagents: 
     #USe MERGE to only add reagent/product or reaction in already if not: 
     cypher = "MERGE (%s:Molecule {CHMid: \"%s\", smiles:\"%s\"})" % (reagent[0], reagent[1], reagent[2]) 
     session.run(cypher) 
     print cypher 

     cypher = "MATCH (m:Molecule {CHMid: \"%s\"}), (r:Reaction {RXNid:\"%s\"}) \ 
        MERGE (m)-[:REAGENT]->(r)" %(reagent[0], reaction[0]) 

     print cypher 
     session.run(cypher) 


    for product in products: 
     #Check if product in already if not: 
     cypher = "MERGE (%s:Molecule {CHMid: \"%s\", smiles:\"%s\"})" % (product[0], product[1], product[2]) 
     print cypher 
     session.run(cypher) 


     cypher = "MATCH (m:Molecule {CHMid: \"%s\"}), (r:Reaction {RXNid:\"%s\"}) \ 
        MERGE (r)-[:PRODUCT]->(m)" %(product[0], reaction[0]) 
     print cypher 
     session.run(cypher) 


#  temp ="" 
#  for cypher in nodes: 
#   temp = temp + cypher 
#  session.run(temp)  
#    
reagents1 = [] 
reagents1.append(["Chem2","Chem2","CCCCN"]) 
reagents1.append(["Chem3","Chem3","CCCCOO"]) 

products1 =[] 
products1.append(["Chem1","Chem1","CCCCNC(O)CCCC"]) 

reaction1 = ["reaction1", "reaction1", "AmideFormation"] 

addReactionNeo4j(reagents1, products1, reaction1) 


session.close()