嵌入式Neo4j Python创建或检查独特的关系

时间:2014-01-22 03:45:41

标签: python neo4j

我正在使用neo4j python模块neo4j-embedded来填充neo4j图。但是我无法弄清楚如何在两个节点之间建立独特的关系。

目前我每次创建一个新的关系,这绝对不是我们想要的。下面的代码显示了一个简单的例子,我只是创建9个节点,然后看看用“friendsWith”关系连接它们,但是目前这些关系并不是唯一的,我最终只有153个关系,但其中大约45个是多余的:

from neo4j import GraphDatabase
neo_db = GraphDatabase('../testdatabase/') 

with neo_db.transaction:                                                         
  person_idx = neo_db.node.indexes.create('people')   
  user_ids = [1,2,3,4,5,6,7,8,9]                                                 

  for user in user_ids:
    ##########################################################################
    ## Check if user exists in neo4j,                      
    ## If not create it and save id, otherwise find the id.                    
    ########################################################################## 
    person_node = person_idx['name'][user].single                              
    if person_node == None:                                                    
      person_node = neo_db.node(name=user)                                     
      person_idx['name'][user] = person_node                                   

    for friend in user_ids:                                                    
      ##########################################################################
      ## Check if friend exists in neo4j,                              
      ## If not create it and save id, otherwise find the id.                    
      ########################################################################## 
      friend_node = person_idx['name'][friend].single                          
      if friend_node == None:                                                  
        friend_node = neo_db.node(name=friend)                                 
        person_idx['name'][friend] = friend_node                               
      relationship = person_node.friendsWith(friend_node)

有没有办法检查使用上面提到的python模块在两个节点之间是否存在“friendsWith”类型的关系?或者只是创建关系的方式 其中一种类型尚不存在。

我正在寻找一种优选的解决方案,不需要使用cypher和查询命令查询数据库。

感谢您的帮助。


编辑:

我意识到你可以使用cypher获得如下解决方案,但是我正在寻找一种可以使用python完成的方法,理想情况下没有任何cypher的先验知识。部分原因是,我并不特别想要为我将广泛使用的功能编写一个即席查询,只是使用不同的节点和关系。

    result = neo_db.query("START n = node:people(name='%i'),m=node:people(name='%i') MATCH (n)-[r:friendsWith]-(m) RETURN r;"%(user,friend))
    if result.single == None:                                                   
      relationship = person_node.friendsWith(friend_node) 

1 个答案:

答案 0 :(得分:1)

为什么不想使用密码?

如果你想避免重复,你必须:

  1. 采取写锁定(例如,通过从“锁定”节点中删除一些不存在的属性)
  2. 查找所有当前对/结束节点并将它们/它们的ID放入集合结构
  3. 创建新关系时,请检查该集
  4. 否则,您必须遍历每个create上的所有rel,以检查当前要添加的目标节点是否已连接到当前源节点。