无法将 GraphObject 转换为节点
Cannot cast GraphObject to Node
我将 AbstractQuery
定义为 GraphObject
的 Child :
class AbstractQuery(GraphObject):
__primarykey__ = "hash"
hash = Property()
projname = Property()
def __init__(self, hash):
self.hash = hash
self.projname = "" # TODO:initialize this
并遍历我(已经存在的)图表中的所有 SQLQuery
objects,并希望创建一个由散列组成的新 AbstractQuery
。任何 SQLQuery
散列到确定 AbstractQuery
的散列应该被连接:
def addAbstractionLayerSqlQueries(graph, logger=None):
abstractQueryTable = getAbstractQueries(graph, logger)
sqlqueries = graph.data("MATCH (n:SQLQuery) return n")
if logger is not None:
logger.info("abstracting {} queries".format(len(sqlqueries)))
counter = 1
for iterator in sqlqueries:
query = iterator['n']
if logger is not None:
logger.info("abstracting query {}/{}".format(counter,
len(sqlqueries)))
hash = sqlNormalizer.generate_normalized_query_hash(query['ts'])
if hash not in abstractQueryTable:
abstractQueryNode = al.AbstractQuery(hash)
abstractQueryTable[hash] = abstractQueryNode
graph.push(abstractQueryNode)
rel = Relationship(query, "ABSTRACTSTO", abstractQueryTable[hash])
graph.create(rel)
counter = counter + 1
在我开始这个过程之前,我提取了所有已经存在的 AbstractQueries 的 table(使用散列作为键),以防止创建相同的 AbstractQuery 两次。
然而,当我 运行 方法时,我以异常结束:
TypeError: Cannot cast AbstractQuery to Node
为什么会这样,我该如何解决?
我之前使用此表示法在图表中输入了多个 SQLQueries
:
class SQLQuery(GraphObject):
__primarykey__ = "uuid"
uuid = Property()
projname = Property()
session = Property()
user = Property()
seq = Property()
ts = Property()
sql = Property()
Statement = RelatedTo("SQLStatement")
AbstractsTo = RelatedTo("AbstractQuery")
def __init__(self, projname=None, session=None, user=None,
seq=None, ts=None, sql=None):
self.projname = projname
self.session = session
self.user = user
self.seq = seq
self.ts = ts
self.sql = sql
self.uuid = "{} [{} {}] {}.{}.{}".format(type(self).__name__,
seq, ts, projname,
session, user)
因为我能够使用这种表示来表示和输入节点,所以我很惊讶为什么 py2neo 拒绝我的 AbstractQuery
class 作为我的 addAbstractionLayerSqlQueries
函数中的节点。
我通过仅使用对象模型并替换 graph.data(...) 查询部分解决了问题:
def addAbstractionLayerSqlQueries(graph, logger=None):
abstractQueryTable = getAbstractQueries(graph, logger)
sqlqueries = list(adlsql.SQLQuery.select(graph))
print type(sqlqueries)
if logger is not None:
logger.info("abstracting {} queries".format(len(sqlqueries)))
counter = 1
for query in sqlqueries:
print type(query)
if logger is not None:
logger.info("abstracting query {}/{}".format(counter,
len(sqlqueries)))
hash = sqlNormalizer.generate_normalized_query_hash(query.ts)
if hash not in abstractQueryTable:
abstractQueryNode = al.AbstractQuery(hash)
abstractQueryTable[hash] = abstractQueryNode
graph.push(abstractQueryNode)
query.AbstractsTo.add(abstractQueryTable[hash])
graph.push(query)
counter = counter + 1
但是,错误的真正原因仍然未知,我会接受任何能解释这一点的答案。这个答案只是解决问题。
您正在混合两层 API。 OGM 层位于常规 py2neo API 之上,GraphObject
不直接对应于 Node
(它也包含其他内容)。因此,您不能直接从 GraphObject
构建 Relationship
。
要访问您GraphObject
后面的核心节点,您可以使用my_object.__ogm__.node
。
我将 AbstractQuery
定义为 GraphObject
的 Child :
class AbstractQuery(GraphObject):
__primarykey__ = "hash"
hash = Property()
projname = Property()
def __init__(self, hash):
self.hash = hash
self.projname = "" # TODO:initialize this
并遍历我(已经存在的)图表中的所有 SQLQuery
objects,并希望创建一个由散列组成的新 AbstractQuery
。任何 SQLQuery
散列到确定 AbstractQuery
的散列应该被连接:
def addAbstractionLayerSqlQueries(graph, logger=None):
abstractQueryTable = getAbstractQueries(graph, logger)
sqlqueries = graph.data("MATCH (n:SQLQuery) return n")
if logger is not None:
logger.info("abstracting {} queries".format(len(sqlqueries)))
counter = 1
for iterator in sqlqueries:
query = iterator['n']
if logger is not None:
logger.info("abstracting query {}/{}".format(counter,
len(sqlqueries)))
hash = sqlNormalizer.generate_normalized_query_hash(query['ts'])
if hash not in abstractQueryTable:
abstractQueryNode = al.AbstractQuery(hash)
abstractQueryTable[hash] = abstractQueryNode
graph.push(abstractQueryNode)
rel = Relationship(query, "ABSTRACTSTO", abstractQueryTable[hash])
graph.create(rel)
counter = counter + 1
在我开始这个过程之前,我提取了所有已经存在的 AbstractQueries 的 table(使用散列作为键),以防止创建相同的 AbstractQuery 两次。
然而,当我 运行 方法时,我以异常结束:
TypeError: Cannot cast AbstractQuery to Node
为什么会这样,我该如何解决?
我之前使用此表示法在图表中输入了多个 SQLQueries
:
class SQLQuery(GraphObject):
__primarykey__ = "uuid"
uuid = Property()
projname = Property()
session = Property()
user = Property()
seq = Property()
ts = Property()
sql = Property()
Statement = RelatedTo("SQLStatement")
AbstractsTo = RelatedTo("AbstractQuery")
def __init__(self, projname=None, session=None, user=None,
seq=None, ts=None, sql=None):
self.projname = projname
self.session = session
self.user = user
self.seq = seq
self.ts = ts
self.sql = sql
self.uuid = "{} [{} {}] {}.{}.{}".format(type(self).__name__,
seq, ts, projname,
session, user)
因为我能够使用这种表示来表示和输入节点,所以我很惊讶为什么 py2neo 拒绝我的 AbstractQuery
class 作为我的 addAbstractionLayerSqlQueries
函数中的节点。
我通过仅使用对象模型并替换 graph.data(...) 查询部分解决了问题:
def addAbstractionLayerSqlQueries(graph, logger=None):
abstractQueryTable = getAbstractQueries(graph, logger)
sqlqueries = list(adlsql.SQLQuery.select(graph))
print type(sqlqueries)
if logger is not None:
logger.info("abstracting {} queries".format(len(sqlqueries)))
counter = 1
for query in sqlqueries:
print type(query)
if logger is not None:
logger.info("abstracting query {}/{}".format(counter,
len(sqlqueries)))
hash = sqlNormalizer.generate_normalized_query_hash(query.ts)
if hash not in abstractQueryTable:
abstractQueryNode = al.AbstractQuery(hash)
abstractQueryTable[hash] = abstractQueryNode
graph.push(abstractQueryNode)
query.AbstractsTo.add(abstractQueryTable[hash])
graph.push(query)
counter = counter + 1
但是,错误的真正原因仍然未知,我会接受任何能解释这一点的答案。这个答案只是解决问题。
您正在混合两层 API。 OGM 层位于常规 py2neo API 之上,GraphObject
不直接对应于 Node
(它也包含其他内容)。因此,您不能直接从 GraphObject
构建 Relationship
。
要访问您GraphObject
后面的核心节点,您可以使用my_object.__ogm__.node
。