Neo4j Многие к 1 Отношения - PullRequest
0 голосов
/ 26 января 2019

В настоящее время у меня есть два узла, известные как "friend" и "friendOfAFriend". Я хочу отобразить отношение "многие к 1", где многие "friends" - это "friends_to" только 1 "friendOfFriend". Единственное исключение - я хочу, чтобы «друзья» ходили в «friendsOfFriend», только когда «друг» может перейти только к 1 «friendofAFriend». У меня есть CSV-файл, в котором указаны имена «friends» и «friendOfAFriends», но некоторые друзья могут использовать несколько разных «friendsOfAFriends», и я хочу этого избежать. Вот мой текущий код:

MERGE(f:Friend{name:csv.name}) 
MERGE(fo:FriendOfAFriend{name:csv.fof}) 
OPTIONAL MATCH (f:f)-[fr:friend_to]->(fo:fo)
CREATE (f)-[newf:friend_to]->(newfo:fo)
RETURN f, new, fewfo

Я был бы очень признателен, если бы кто-нибудь указал мне правильное направление, где я показываю только «друзей», которые могут обращаться только к одному «FriendOfAFriend» в отношениях «многие к 1». Прямо сейчас он отображает каждого «друга» из моего CSV (дублирует список друзей), идущего к каждому «FriendOfAFriend».

1 Ответ

0 голосов
/ 26 января 2019

Ваши данные находятся в файле CSV, а еще нет в базе данных neo4j. Поэтому, чтобы избежать хранения нежелательных узлов и связей в базе данных, вам нужно написать запрос, который считывает все данные CSV в память, отфильтровывается ненужные данные в памяти, и, наконец, сохранили нужные данные в БД. Это определенно возможно сделать, но, возможно, в этом нет необходимости, и это может привести к нехватке памяти, если файл CSV слишком велик.

Я предлагаю вам сделать то, что вы хотите, в 2 этапа. Во-первых, просто создайте все узлы и отношения из CSV-файла, не отсеивая ничего (и опуская ваше предложение OPTIONAl MATCH, которое ничего не делает, кроме потери времени).

Во-вторых, удалите ненужные узлы и отношения:

MATCH (f:Friend)
WHERE SIZE((f)-[:friend_to]->(:FriendOfAFriend)) > 1
FOREACH(p IN (f)-[:friend_to]->(:FriendOfAFriend) | DELETE RELATIONSHIPS(p)[0])
DETACH DELETE f;

Предложение WHERE - это быстрая проверка степени для эффективного поиска узлов Friend с более чем 1 исходящим отношением friend_to. Предложение FOREACH удалит нежелательные отношения friend_to, а предложение DETACH DELETE удалит нежелательные узлы Friend (и любые оставшиеся отношения, которые они могут иметь).

[Кстати, ваша модель данных (с Friend и FriendOfAFriend) кажется неправильной, но это другая проблема.]

...