Neo4j 无法将GraphObject强制转换为节点

Neo4j 无法将GraphObject强制转换为节点,neo4j,py2neo,Neo4j,Py2neo,我定义了一个AbstractQuery,作为GraphObject的子对象: class AbstractQuery(GraphObject): __primarykey__ = "hash" hash = Property() projname = Property() def __init__(self, hash): self.hash = hash self.projname = "" # TODO:initiali

我定义了一个
AbstractQuery
,作为
GraphObject
的子对象:

class AbstractQuery(GraphObject):

    __primarykey__ = "hash"

    hash = Property()
    projname = Property()

    def __init__(self, hash):
        self.hash = hash
        self.projname = ""  # TODO:initialize this
并在我的(已经存在的)图中的所有
SQLQuery
对象上迭代,并希望创建一个新的
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
在开始这个过程之前,我提取一个表(使用散列作为键)来包含所有已经存在的AbstractQuery,以防止创建同一个AbstractQuery两次

但是,当我运行该方法时,最终出现了一个异常:

TypeError:无法将AbstractQuery强制转换为节点

这是为什么?我如何解决这一问题?

我之前使用以下表示法在我的图表中输入了多个
sqlquerys

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
类作为我的
addAbstractionLayerSqlQueries
函数中的节点感到非常震惊。

我仅通过使用对象模型并替换图形解决了这个问题。数据(…)查询部分:

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
并不直接对应于
节点(它还包含其他内容)。因此,您不能直接与
图形对象
建立关系

要访问
GraphObject
后面的核心节点,可以使用
my\u对象