Я использую Spring Data Neo4j 4. Допустим, у меня есть узлы типа лица и соответствующий объект домена Java являетсяСвязанные узлы того же типа с SDN
@NodeEntity
public class Person {
@GraphId private Long id;
private String name;
private String lastName;
@Relationship(type = "KNOWS")
Set<Person> myTypes;
}
И я пытаюсь создать график как `
Джон-KNOWS-> Джордж и Джон-KNOWS- > Ann. Ann-KNOWS-> Dug
`. Ниже показано, как я настраиваю объекты домена и сохраняю.
Person john = new Person("John","P");
Person george = new Person("George","B");
Person Ann = new Person("Ann","M");
Person Dug = new Person("Dug","S");
Set<Person> Persons= new HashSet<Person>();
Set<Person> Persons1= new HashSet<Person>();
Persons1.add(Dug);
Ann.setMyTypes(Persons1);
Persons.add(george);
Persons.add(Ann);
john.setMyTypes(Persons);
personRepository.save(john);
personRepository.save(george);
personRepository.save(Ann);
personRepository.save(Dug);
Но, к моему удивлению, только узлы создаются без связей. Я отлаживал это и после этой строки personRepository.save (john) Узлы со связями создавались, но во время последующего сохранения все отношения были удалены. Ниже приведено то, что напечатано в журналах, и ясно сказано, что отношения удалены.
Request: UNWIND {rows} as row CREATE (n:`Person`) SET n=row.props RETURN row.nodeRef as ref, ID(n) as id, row.type as type with params {rows=[{nodeRef=-2115049587, type=node, props={name=George, attrib=B}}, {nodeRef=-341599918, type=node, props={name=Ann, attrib=M}}, {nodeRef=-737678933, type=node, props={name=John, attrib=P}}, {nodeRef=-1025122203, type=node, props={name=Dug, attrib=S}}]}
Request: UNWIND {rows} as row MATCH (startNode) WHERE ID(startNode) = row.startNodeId MATCH (endNode) WHERE ID(endNode) = row.endNodeId MERGE (startNode)-[rel:`KNOWS`]->(endNode) RETURN row.relRef as ref, ID(rel) as id, row.type as type with params {rows=[{relRef=-1807300324, endNodeId=2448, type=rel, startNodeId=2450}, {relRef=-272508006, endNodeId=2451, type=rel, startNodeId=2449}, {relRef=-845107952, endNodeId=2449, type=rel, startNodeId=2450}]}
Request: UNWIND {rows} as row MATCH (startNode) WHERE ID(startNode) = row.startNodeId MATCH (endNode) WHERE ID(endNode) = row.endNodeId MATCH (startNode)-[rel:`KNOWS`]->(endNode) DELETE rel with params {rows=[{endNodeId=2448, startNodeId=2450}]}
Request: UNWIND {rows} as row MATCH (startNode) WHERE ID(startNode) = row.startNodeId MATCH (endNode) WHERE ID(endNode) = row.endNodeId MATCH (startNode)-[rel:`KNOWS`]->(endNode) DELETE rel with params {rows=[{endNodeId=2449, startNodeId=2450}]}
Request: UNWIND {rows} as row MATCH (startNode) WHERE ID(startNode) = row.startNodeId MATCH (endNode) WHERE ID(endNode) = row.endNodeId MATCH (startNode)-[rel:`KNOWS`]->(endNode) DELETE rel with params {rows=[{endNodeId=2451, startNodeId=2449}]}
Не знаете, где я неправильно или это, как предполагается работать
Спасибо. Но выше всего лишь простой вариант. Я занимаюсь импортом данных из огромного файла excel, и если мне нужно выяснить, что сохранить, а что не экономить, сама по себе становится огромной задачей. Во-вторых, во многих случаях я не знаю направления отношений перед раздачей. Есть ли способ указать направление во время выполнения? Ниже в сообщении говорится, что мы не можем http://stackoverflow.com/questions/18517000/dynamicrelationshiptype-in-spring-data-neo4j-or-defining-relationship-types-at-r –
Нет, вы не можете указывать маршруты во время выполнения с SDN/OGM. OGM не может быть подходящим инструментом для работы, то есть импорт из excel – Luanne