Próbuję utworzyć / zaktualizować odrębne relacje między dwoma węzłami za pomocą pojedynczej operacji zbiorczej w Cypherze, wykorzystując MERGE
i FOREACH
klauzula.
W tej chwili próbuję to zrobić za pomocą następującego, ale nie jest poprawne składniowo:
MERGE (u1:Person {id:1})
MERGE (u2:Person {id:3})
FOREACH (score IN [{name:"R1",val:1.0},{name:"R2",val:0.5}]|
MERGE (u1)-[r]-(u2)
WHERE type(r) = score.name
ON CREATE SET r.weight=score.val,r.created=timestamp(),r.updated=r.created
ON MATCH SET r.weight=score.val,r.updated=timestamp()
)
Proszę, zasugeruj mi zapytanie, aby to osiągnąć.
Odpowiedzi:
0 dla odpowiedzi № 1Myślę, że problem z zapytaniem brzmi:
MERGE (u1)-[r]-(u2)
WHERE type(r) = score.name
Cretowanie relacji bez typu nie jest dozwolone, ani nie używa nazwy zmiennej (score.name) dla typu relacji. Mogę jedynie zasugerować dwa częściowe rozwiązania:
1) Jeśli piszesz zapytanie z jakiegoś kodu, wstaw stamtąd nazwę. Na przykład w PHP::
....
$rels[] = [val => 1.0, name => "R1"];
foreach ($rels as $rel) {
$query[] = "MERGE (u1)-[r:" . "$rel["name"]" . "]-(u2)";
ON CREATE SET r.weight=score.val, r.created=timestamp(), r.updated=r.created
ON MATCH SET r.weight=score.val,r.updated=timestamp()
}
....
Prawdopodobnie spowodowałoby to błąd z powodu ponownego użycia identyfikatora „r” dla relacji, ale można tego uniknąć, czyniąc go również zmiennym.
2) Czystsze rozwiązanie, ale może nie być dostępne w twoim środowisku, to używanie APOC. W Neo4j 3.0+ jest dostępny do zainstalowania z wieloma funkcjami, w szczególności do używania apoc.create.relationship.
Nie znam tego, ale tutaj jest całkiem dobrze wyjaśnione.
W każdym razie tutaj też opuszczam aktualny otwarty problem w repozytorium neo4j w przypadku, gdy jest to przydatne.