2017-03-12 53 views
2

尝试使用py2neo版本3将数据导入干净的neo4j图形数据库。我已经定义了几个节点类型,如下所示,并且所有似乎进展顺利 - 除我没有看到节点出现在我的neo4j浏览器中。py2neo v3 AttributeError:object has no attribute'db_exists'

下面是相关的导入代码;我已验证记录正确加载到Python变量中。

for row in data:  
    ds = DataSource() 
    # parse Source of Information column as a list, trimming whitespace 
    ds.uri = list(map(str.strip, row['data_source'].split(','))) 
    ds.description = row['data_source_description'] 
    graph.merge(ds) 

但是,当我试图做graph.exists(ds),我回到了以下一组错误/回溯的:

Traceback (most recent call last): 
    File "mydir/venv/lib/python3.5/site-packages/py2neo/database/__init__.py", line 1139, in exists 
    return subgraph.__db_exists__(self) 
AttributeError: 'DataSource' object has no attribute '__db_exists__' 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File  "mydir/venv/lib/python3.5/site-packages/py2neo/database/__init__.py", line 478, in exists 
    return self.begin(autocommit=True).exists(subgraph) 
    File "mydir/venv/lib/python3.5/site-packages/py2neo/database/__init__.py", line 1141, in exists 
    raise TypeError("No method defined to determine the existence of object %r" % subgraph) 
TypeError: No method defined to determine the existence of object <DataSource uri=['my_uri']> 

出乎我的意料,我无法找到另一个论坛上发帖讨论这个问题。我猜测有一个问题从GraphObject继承,但是there doesn't seem to be an explicit definition of a __db_exists__ property for GraphObject,要么。事实上,我发现这个属性的唯一地方是在definition of the exists function,当它产生这个错误。

任何人都可以看到我在做什么错在这里?

节点类的定义如下:

class Content(GraphObject):    # group Person and Institution 
    pass 

class Person(Content): 
    __primarykey__ = 'name' 

    name = Property() 
    in_scholar_names = Property() 
# 
    mentored = RelatedTo('Person') 
    mentored_by = RelatedFrom('Person', 'MENTORED') 
    worked_alongside = Related('Person', 'WORKED_ALONGSIDE') 
    studied_at = RelatedTo('Institution') 
    worked_at = RelatedTo('Institution') 
    tagged = RelatedTo('Tag') 
    member_of = RelatedTo('Institution') 

    last_update = RelatedTo('UpdateLog') 

    def __lt__(self, other): 
     return self.name.split()[-1] < other.name.split()[-1] 

class Institution(Content): 
    __primarykey__ = 'name' 
# 
    name = Property() 
    location = Property() 
    type = Property() 
    carnegie_class = Property() 
# 
    students = RelatedFrom('Person', 'STUDIED_AT') 
    employees = RelatedFrom('Person', 'WORKED_AT') 
    members = RelatedFrom('Person', 'MEMBER_OF') 

    last_update = RelatedTo('UpdateLog') 

    def __lt__(self, other): 
     return self.name < other.name 


class User(GraphObject): 
    __primarykey__ = 'username' 

    username = Property() 
    joined = Property() 
    last_access = Property() 
    active = Property() 

    contributed = RelatedTo('UpdateLog') 


class Provenance(GraphObject):   # group UpdateLog and DataSource 
    pass  
# 
class UpdateLog(Provenance): 
    __primarykey__ = 'id' 

    id = Property() 
    timestamp = Property() 
    query = Property() 

    previous = RelatedTo('UpdateLog', 'LAST_UPDATE') 
    next = RelatedFrom('UpdateLog', 'LAST_UPDATE') 
    based_on = RelatedTo('Provenance', 'BASED_ON') 

    affected_nodes = RelatedFrom('Content', 'LAST_UPDATE') 
    contributed_by = RelatedFrom('User', 'CONTRIBUTED') 

class DataSource(Provenance): 
    __primarykey__ = 'uri' 

    id = Property() 
    description = Property() 
    uri = Property() 

    source_for = RelatedFrom('UpdateLog', 'BASED_ON') 


class Tag(GraphObject): 
    __primarykey__ = 'name' 

    name = Property() 
    description = Property() 

    see_also = Related('Tag') 
    tagged = RelatedFrom('Content') 

回答

0

好吧,我想我想通了。我一直在Flask的上下文中学习py2neo,所有这些类定义对于生成给定节点上关系的视图(网页)都很重要和有用。

但是对于我目前正在编写的数据导入脚本,即首先实际创建节点和关系,我需要使用“节点”和“关系”的香草类,并指定类型作为函数的参数。上面的原代码的更新版本不产生错误,并graph.exists(ds)回报true后:注意

for row in data:  
    ds = Node("DataSource") 
    # parse Source of Information column as a list, trimming whitespace 
    ds['uri'] = list(map(str.strip, row['data_source'].split(','))) 
    ds['description'] = row['data_source_description'] 
    graph.merge(ds) 

其他两个发现:

  1. 我的类继承是没谱开始说起,因为我应该一直在试图从Node继承,而不是GraphObject(即使GraphObject是正确的类在瓶的情况下继承回)
  2. 对于Node类,我个人有T o使用dict样式的属性分配,方括号和键名称作为引用字符串;点符号在这里基本没有了,我很惊讶我没有得到更多的错误,并且更快。
相关问题