Получение нескольких возвращаемых свойств отношения из одного вызова cypher

Я новичок в базах данных cypher, neo4j и графах в целом. Модель данных, с которой мне дали работать, немного сбивает с толку, но похоже, что узлы - это просто заполнители GUID со всеми реальными «данными» в качестве свойств в отношениях с узлами (которые связывают каждый узел с нулевым узлом).

Каждый узел (который в основном имеет только guid) имеет дюжину отношений с парами ключ / значение, которые являются фактическими данными, которые мне нужны. (Полагаю, это было сделано для управления версиями? ..)

Мне нужно сделать один вызов cypher, чтобы получить свойства двух (или более) отношений, связанных с одним и тем же узлом - вот два вызова, которые я хотел бы сделать одним вызовом;

start n = Node(*)
match n-[ar]->m
where has(ar.value) and has(ar.proptype) and ar.proptype = 'ccid' 
return ar.value

а также

start n = Node(*)
match n-[br]->m
where has(br.value) and has(br.proptype) and br.proptype = 'description'
return br.value

Как мне сделать это за один вызов шифра?

РЕДАКТИРОВАТЬ - для уточнения;

Я хочу получить результаты в виде списка строк со столбцом для каждого запрошенного значения.

Что-то вроде вернулось;

n.id как узел, ar.value как CCID, br.value как описание


person Jason Ellis    schedule 25.06.2013    source источник


Ответы (2)


Поправьте меня, если я ошибаюсь, но я считаю, что вы можете просто сделать это:

start n = Node(*)
match n-[r]->m
where has(r.value) and has(r.proptype) and (r.proptype = 'ccid' or r.proptype = 'description') 
return r.value

Дополнительную документацию по операциям Cypher см. здесь.

Основываясь на ваших изменениях, я предполагаю, что вы действительно ищете случаи, когда у узла есть и ccid, и описание? Вопрос расплывчатый, но я думаю, что это то, что вы ищете.

start n = Node(*)
match n-[ar]->m, n-[br]->m
where (has(ar.value) and has(ar.proptype) and ar.proptype = 'ccid') and 
      (has(br.value) and has(br.prototype) and br.proptype = 'description') 
return n.id as Node, ar.value as CCID, br.value as Description
person Slater Victoroff    schedule 25.06.2013
comment
Вы должны квалифицировать OR, заключив его в круглые скобки, поскольку эта оценка должна быть ошибочной. - person Nicholas; 25.06.2013
comment
Да, это действительно работает, но я бы хотел получить это, чтобы я мог получить их в той же строке результатов. То есть я хочу сказать return n.id, r.ccid, r.description или что-то еще ... - person Jason Ellis; 25.06.2013
comment
Боюсь, я не совсем понимаю. Не могли бы вы обновить свой вопрос более подробно, поскольку он, кажется, не совсем точно отражает то, что вы хотите? - person Slater Victoroff; 25.06.2013
comment
Отредактировано. Добавлены AR и BR для отношения a и b, затем добавлено возвращаемое значение псевдо-значения внизу, показывающее, что я хочу, чтобы отношение a и b было в одной строке. - person Jason Ellis; 25.06.2013
comment
@JasonEllis Я не уверен, что понял, что вы имеете в виду, но я думаю, что это изменение должно дать вам то, что вы хотите. - person Slater Victoroff; 25.06.2013
comment
Слейтер, ваша правка кажется разумной и правильным решением, но линия соответствия заставляет neo зависать. Должно ли совпадение n- [ar] -m, n- [br] -m занять много времени? - person Jason Ellis; 25.06.2013
comment
Хорошо, это именно то, что я хочу ... спасибо ... но, очевидно, выполнение node (*) против моего набора данных из 5k узлов, 60k отношений и 500k свойств вызывает некоторые проблемы с тайм-аутом .. Пора начинать работать с ограничениями, я думаю =) Спасибо - person Jason Ellis; 25.06.2013
comment
@JasonEllis хех, да, я собирался упомянуть, что Node (*), вероятно, не лучший метод, но я подумал, что вы разберетесь с этим самостоятельно. Удачного взлома. - person Slater Victoroff; 25.06.2013

Сопоставлять отношения можно с двух сторон:

start n = Node(*)
match m<-[br]-n-[ar]->m
where has(ar.value) and has(ar.proptype) and ar.proptype = 'ccid' and 
has(br.value) and has(br.proptype) and br.proptype = 'description'
return ar.value, br.value
person Grapheneer    schedule 29.08.2017