/ / Masowe połączenie relacji w Neo4J za pomocą Cyphera - neo4j, szyfr, luzem

Masowe scalanie relacji w Neo4J przy użyciu Cypher - neo4j, cypher, bulk

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 № 1

Myś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.