【问题标题】:Cannot cast GraphObject to Node无法将 GraphObject 转换为节点
【发布时间】:2016-09-19 08:51:13
【问题描述】:

我将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

在开始此过程之前,我会提取所有现有 AbstractQueries 的表(使用哈希作为键),以防止两次创建相同的 AbstractQuery。

但是,当我运行该方法时,我会遇到异常:

TypeError:无法将 AbstractQuery 转换为节点

为什么会这样?我该如何解决?

我之前使用此表示在我的图表中输入了多个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 类作为我的 addAbstractionLayerSqlQueries 函数中的节点。

【问题讨论】:

    标签: neo4j py2neo


    【解决方案1】:

    您正在混合两层 API。 OGM 层位于常规 py2neo API 之上,GraphObject 不直接对应于Node(它也包含其他内容)。因此,您不能直接从GraphObject 构建Relationship

    要访问GraphObject 后面的核心节点,可以使用my_object.__ogm__.node

    【讨论】:

      【解决方案2】:

      我只使用对象模型并替换了 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
      

      但是,错误的实际原因仍然未知,我会接受任何解释这一点的答案。这个答案只是解决问题。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-06-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多