1

我正在使用 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

和边缘.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”添加到“类别”列。我认为批量导入器与新模型不兼容:(

4

3 回答 3

0

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

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

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

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

start cdu=node:TokenNode(identifier="cdu"),spd=node:TokenNode(identifier="spd")
match cdu-[r]-spd
return type(r);
于 2013-09-07T17:38:08.830 回答
0

嗨,这里是新模型的作者。

关系管理器在发出连接时使用 CREATE UNIQUE:

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

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

但是,欢迎您使用关系管理器的子类来提供替代行为。

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

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

于 2013-09-11T10:14:34.403 回答
0

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

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

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

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

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

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

于 2015-02-17T04:52:26.840 回答