无法与Neomodel和jexp-batch-import建立关系

时间:2013-09-07 14:06:50

标签: python neo4j neomodel

我正在使用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个关系。但我无法访问neomodel中的关系。见下文:

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不兼容:(

3 个答案:

答案 0 :(得分:0)

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

理论上可以更新属性,但实际上这不是一般化的东西。您可以在csv文件上预先执行此操作,也可以在cypher语句之后执行此操作。

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

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

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

答案 1 :(得分:0)

你好neomodel的作者。

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

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

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

但欢迎您将RelationshipManager子类化为提供替代行为。

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

neomodel是一个固执己见的框架,通过使用它来购买某种思维方式。但是,如果你在irc.freenode.org上的#neo4j上ping我(robsmoniker),我可以帮助你让批量导入器和neomodel玩得很好。

答案 2 :(得分:0)

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

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

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

文档中没有提到它这一事实让我失去了几个小时。你何时看一下代码还不清楚。事实上有一个名为" all()"在每个基数对象上都有误导性。

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

我希望能找到一些时间来帮助改进NeoModel。它是Neo4j最先进的OGM。