Не удалось получить отношения с Neomodel и jexp-batch-import
Я использую neomodel и jexp-batch-import ( 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-import, чтобы потом использовать модель, приведенную выше.
Мой 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 делает что-то странное. Вставьте оба узла и одно отношение между ними.
Структура от партии-импортера
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 ответа
Есть ли способ сопоставить отношения с событием? И возможно ли увеличить вес ребра вместо создания двух ребер при импорте с помощью пакетного импортера?
Теоретически возможно обновить свойства, но на самом деле это не будет чем-то обобщенным. Вы можете сделать это либо заранее в файлах csv, либо впоследствии с помощью оператора cypher.
Или вы пишете свой собственный вариант пакетного импортера, используя BatchInserter-Java-API (вы можете начать с разветвления и изменения репозитория пакетного импорта).
Я не знаю, нужно ли что-то еще в отношениях, например type
свойства узлов или отношений. Вы можете проверить с Cypher, что импорт работал.
start cdu=node:TokenNode(identifier="cdu"),spd=node:TokenNode(identifier="spd")
match cdu-[r]-spd
return type(r);
Я была такая же проблема. Я часами пытался выяснить, есть ли какая-либо ошибка или я просто не понимаю API NeoModel. Я прочитал код и всю документацию, но она мне не была понятна.
После поиска в Google я наконец нашел этот вопрос. И автор NeoModel ответит на это ниже.
Это очень расстраивает из-за невозможности создать отношения с более чем одним узлом одного и того же класса. Это делает невозможным использование NeoModel с моим доменом.
Тот факт, что это не было упомянуто в документации, заставил меня потерять несколько часов. Это также не ясно, когда вы смотрите на код. Тот факт, что в каждом объекте мощности есть функция с именем "all()", вводит в заблуждение.
После дня потерянной работы я отказался от NeoModel и переключился на чистый py2neo 2.0.
Я хотел бы найти время, чтобы помочь улучшить NeoModel. Это самый продвинутый OGM для Neo4j.
Привет автор neomodel здесь.
RelationshipManager использует CREATE UNIQUE при выдаче соединения:
https://github.com/robinedwards/neomodel/blob/master/neomodel/relationship_manager.py
Это означает, что между двумя узлами одного типа и направления будет только одна связь.
Тем не менее, вы можете предложить подкласс RelationshipManager альтернативное поведение.
Что касается пакетного импорта, neomodel ожидает, что узлы одного и того же типа будут классифицированы через узел категории. В вашем примере все ваши TokenNodes должны быть классифицированы, так как большая часть кода Neomodel предполагает, что эти отношения существуют.
Neomodel - это самоуверенный фреймворк, использующий его как своего рода покупку в определенном образе мышления. Однако, если вы пингуете меня (robsmoniker) на #neo4j на irc.freenode.org, я, вероятно, могу помочь вам сделать так, чтобы пакетный импортер и neomodel играли хорошо.