我正在使用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不兼容:(
答案 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代码假定存在这些关系。
答案 2 :(得分:0)
我有同样的问题。我花了几个小时试图弄清楚是否有任何错误,或者我根本不理解NeoModel API。我阅读了代码和所有文档,但我不清楚。
谷歌搜索后我终于找到了这个问题。 NeoModel作者在下面回答它。如果无法与同一个类的多个节点建立关系,那将非常令人沮丧。这使得无法在我的域中使用NeoModel。
文档中没有提到它这一事实让我失去了几个小时。你何时看一下代码还不清楚。事实上有一个名为" all()"在每个基数对象上都有误导性。
经过一天的失去工作后,我放弃了NeoModel并切换到纯py2neo 2.0。
我希望能找到一些时间来帮助改进NeoModel。它是Neo4j最先进的OGM。