py2neo v3 AttributeError: object has no attribute 'db_exists'
py2neo v3 AttributeError: object has no attribute 'db_exists'
尝试使用 py2neo 版本 3 将数据导入干净的 neo4j 图形数据库。我定义了如下几种节点类型,一切似乎 都进行得很顺利——除了我没有在我的 neo4j 浏览器中看到节点。
这是相关的导入代码;我已验证记录已正确加载到 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']>
令我惊讶的是,我找不到另一个论坛 post 讨论这个问题。我猜测是从 GraphObject
继承的问题,但是 there doesn't seem to be an explicit definition of a __db_exists__
property for GraphObject
, either. In fact, the only place I can find that property mentioned is in the definition of the exists
function,当它生成此错误时。
谁能看出我做错了什么?
节点class定义如下:
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')
好的,我想我明白了。我一直在 Flask 的上下文中学习 py2neo,其中所有这些 class 定义对于生成给定节点上关系的视图(网页)都很重要且有用。
但是对于我目前正在编写的数据导入脚本,即首先实际创建节点和关系,我需要使用 'Node' 和 class 的香草 [=]es =30=],并且只需将类型指定为函数的参数。上面原始代码的这个更新版本不会产生任何错误,之后 graph.exists(ds)
returns 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)
另外两个值得注意的发现:
- 我的 class 继承从一开始就不合时宜,因为我应该尝试继承
Node
,而不是 GraphObject
(尽管 GraphObject
是在 Flask 上下文中继承的正确 class)
- 对于
Node
class,我必须使用字典式的属性赋值,方括号和键名作为引号字符串;点符号在这里是错误的,我很惊讶我没有抛出更多错误,而且更快。
尝试使用 py2neo 版本 3 将数据导入干净的 neo4j 图形数据库。我定义了如下几种节点类型,一切似乎 都进行得很顺利——除了我没有在我的 neo4j 浏览器中看到节点。
这是相关的导入代码;我已验证记录已正确加载到 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']>
令我惊讶的是,我找不到另一个论坛 post 讨论这个问题。我猜测是从 GraphObject
继承的问题,但是 there doesn't seem to be an explicit definition of a __db_exists__
property for GraphObject
, either. In fact, the only place I can find that property mentioned is in the definition of the exists
function,当它生成此错误时。
谁能看出我做错了什么?
节点class定义如下:
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')
好的,我想我明白了。我一直在 Flask 的上下文中学习 py2neo,其中所有这些 class 定义对于生成给定节点上关系的视图(网页)都很重要且有用。
但是对于我目前正在编写的数据导入脚本,即首先实际创建节点和关系,我需要使用 'Node' 和 class 的香草 [=]es =30=],并且只需将类型指定为函数的参数。上面原始代码的这个更新版本不会产生任何错误,之后 graph.exists(ds)
returns 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)
另外两个值得注意的发现:
- 我的 class 继承从一开始就不合时宜,因为我应该尝试继承
Node
,而不是GraphObject
(尽管GraphObject
是在 Flask 上下文中继承的正确 class) - 对于
Node
class,我必须使用字典式的属性赋值,方括号和键名作为引号字符串;点符号在这里是错误的,我很惊讶我没有抛出更多错误,而且更快。