2016-07-13 3 views
0

Я пытаюсь создать узлы и ребро для некоторых химических веществ и связанные с ними реакции в Neo4j с питоном, но я ударяя проблемы с созданием узла/отношений ...Programatically создание краев в Neo4j с питоном

Моего кода .. .

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

Этот код должен написать шифровальный код и выполнить его в Neo4j.

Это дает следующий Cypher код в качестве выходного

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) 

Этот код работает, как ожидалось при вставке в Neo4j

enter image description here

Но если посмотреть на график, созданный код (который в теория должна выполнять один и тот же код шифрования). Я получаю созданные узлы, но у него возникают проблемы с связыванием узлов вместе с ребрами - оставляя узлы несвязанными.

enter image description here

Может кто-нибудь сообщить мне о том, что я делаю не так?

Благодаря

Chris

ответ

0

У меня есть решение.

Оказывается, если в Neo4j я бегу

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"}) 

, а затем запустить ...

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

реплицировать проблемы с соединительными узлами. Однако, если я запускаю их одновременно, все в порядке.

Изменение моего кода поэтому использовать MATCH и 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() 
Смежные вопросы