【问题标题】:Failed to get relationships with Neomodel and jexp-batch-import无法与 Neomodel 和 jexp-batch-import 建立关系
【发布时间】:2013-09-07 14:06:50
【问题描述】:

我正在使用 neomodel 和 jexp-batch-importer(https://github.com/jexp/batch-import)。我的模型如下所示。

class TokenRel(StructuredRel):
    weight = IntegerProperty(default = 1)

class TokenNode(StructuredNode):
    identifier = StringProperty(unique_index = True, required = True)
    count = IntegerProperty(default = 1)
    occurence = Relationship('TokenNode', 'OCCURENCE', model = TokenRel) 

我尝试使用 jexp-batch-importer 导入节点和关系,以便之后使用上面给出的模型。

我的 node.cvs 看起来像这样:

 identifier:string:TokenNode    count:int
 spd    2
 cdu    3

和 edge.csv:

identifier:string:TokenNode identifier:string:TokenNode occurence
spd cdu OCCURENCE
spd cdu OCCURENCE

Neo4j 的导入适用于 2 个节点和 2 个关系。但我无法访问新模型中的关系。见下文:

spdNode = port.getNode('spd') #exists
cduNode = port.getNode('cdu') #exists

if spdNode.occurence.is_connected(cduNode): 
    print('Yes') # yes will be printed

print(spdNode.count) # 2
print(spdNode.occurence.count()) # print: 0 expected: 2
print(cduNode.occurence.count()) # 0

有没有办法将关系映射到发生?使用批量导入器导入时是否可以增加一条边的权重而不是创建两条边?

问候。

编辑:

我已经分析了批量导入器创建的结构和来自 neomodel 的结构,似乎 neomodel 做了一些奇怪的事情。插入两个节点和它们之间的一个关系。

Batch-Importer 的结构

nodes, id, lablel, count, identifier
1, 1 , /, / , /
2, 2, /, 2, spd
3, 3, /, 3, cdu

source target typ id label weight neo4j-relation
2, 3, direct, 1, /, 1, occurence

这里是neomodel的一个:

nodes, id, label, category, count, identifier
1, 1, /, TokenNode, /, /
2, 2, /, /, 1, spd
3, 4, /, /, 1, cdu

source, target, type, id, label, weight, neo4j-relation, __instance__
1, 2, direct, 2, /, 1, Token_Node, check
1, 3, direct, 3, /, 1, Token_Node, check
3, 2, direct, 1, /, 1, occurence, unchecked 

因此 neomodel 添加了诸如“类别”和“实例”之类的内容,并具有从节点到所有其他节点的关系。它还将“TokenNode”添加到“类别”列。我认为批量导入器与 neomodel 不兼容 :(

【问题讨论】:

  • 你能先尝试用密码(来自neo4j-shell)访问它们吗?例如。 start n=node: TokenNode(identifier="cdu") return n;

标签: python neo4j neomodel


【解决方案1】:

有没有办法将关系映射到发生?使用批量导入器导入时是否可以增加一条边的权重而不是创建两条边?

理论上可以更新属性,但实际上这不是一概而论的。您可以在 csv 文件上预先执行此操作,也可以在之后使用密码语句执行此操作。

或者您使用 BatchInserter-Java-API 编写自己的批处理导入器变体(您可以从分叉和修改批处理导入存储库开始)。

我不知道 neomodel 在这段关系中是否需要其他任何东西,例如type 节点或关系上的属性。您可以使用密码测试导入是否有效。

start cdu=node:TokenNode(identifier="cdu"),spd=node:TokenNode(identifier="spd")
match cdu-[r]-spd
return type(r);

【讨论】:

  • Cypher 查询显示了这些节点之间的两个现有关系。所以导入成功。我认为这个问题与neomodel有关。在插入后通过查询更改边缘权重是一个好主意。谢谢。
【解决方案2】:

这里是 neomodel 的作者。

RelationshipManager 在发出连接时使用 CREATE UNIQUE:

https://github.com/robinedwards/neomodel/blob/master/neomodel/relationship_manager.py#L119

这意味着在一种类型和方向的两个节点之间永远只有一种关系。

不过,欢迎您将RelationshipManager 子类化以提供替代行为。

关于批量导入,neomodel 期望通过类别节点对相同类型的节点进行分类。在您的示例中,您的所有 TokenNode 都需要进行分类,因为许多新模型代码都假设存在这些关系。

neomodel 是一个固执己见的框架,通过使用它,您有点认同某种思维方式。但是,如果您在 irc.freenode.org 上的 #neo4j 上 ping 我 (robsmoniker),我可能会帮助您使批量导入器和 neomodel 发挥得更好。

【讨论】:

    【解决方案3】:

    我遇到了同样的问题。我花了几个小时试图弄清楚是否有任何错误,或者我根本不了解 NeoModel API。我阅读了代码和所有文档,但我并不清楚。

    谷歌搜索后,我终于找到了这个问题。 NeoModel作者在下面回答。

    无法创建与同一类的多个节点的关系非常令人沮丧。这使得我无法在我的域中使用 NeoModel。

    文档中没有提到它的事实让我浪费了几个小时。当您查看代码时也不清楚。每个基数对象上都有一个名为“all()”的函数的事实具有误导性。

    在工作了一天后,我放弃了 NeoModel 并切换到纯 py2neo 2.0。

    不过,我很想找些时间来帮助改进 NeoModel。它是目前 Neo4j 最先进的 OGM。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-03
      • 2023-04-11
      • 1970-01-01
      • 1970-01-01
      • 2020-04-06
      • 1970-01-01
      • 2019-09-02
      相关资源
      最近更新 更多