2014-11-18 4 views
2

Я пытаюсь выполнить Cypher запрос вроде следующего:Фильтрация кратчайшего пути Запрос Cypher с ограничением свойства отношения?

MATCH p = shortestPath((a:Party { currency: 'GBP' })-[:IN_ESCROW { status: 'cleared' }]-(b:Party { currency: 'USD' })) 

Однако, это, кажется, не соблюдая ограничение собственности {статус: «очищается»} и, вместо этого, просто возвращая все кратчайшие пути между соответствующими узлами, которые связаны между собой: отношения IN_ESCROW. Хотя я не могу найти документацию, ссылающуюся на этот конкретный случай, документация ясно показывает, что сопоставление свойств отношений должно быть возможным. Я что-то упустил или это невозможно сделать в Сайфере?

В настоящее время с помощью сообщества версии 2.1.3 Neo4j. Заранее спасибо!

ответ

2

Возможно, это ваша текущая модель: (p1:Party)-[:IN_ESCROW]->(p2:Party).

У вас есть отношения IN_ESCROW в обоих направлениях между сторонами в депонировании? Если это так, возможно, одно из этих отношений не имеет status: 'cleared', что вызывает совпадение.

===

Кроме того, помимо всего прочего, ваша модель, кажется, сломана, так как эскроу договоренность между 2 равными сторонами, так как представляется, не существует каких-либо упорядоченным образом, чтобы определить, какая сторона должна быть «голова» отношения (p1) и которая должна быть «хвостом» (p2). И это делает более вероятным, что вы создадите (в основном избыточные) отношения, идущие в обоих направлениях.

Я думаю, что эта модель имела бы смысл: (p1:Party)<-[:HAS_PARTY]-(e:Escrow)-[:HAS_PARTY]->(p2:Party).

+0

Существует лишь связь между двумя сторонами в одном направлении, очевидно, но Neo4j поддерживает двунаправленные обходы. Этот конкретный запрос не заботится о том, какое направление принимает отношение. Направление отношения в моей модели указывает не более того, какая сторона инициировала обмен. – DaveStance

+0

Это, похоже, не отвечает ни на одну часть моего первоначального вопроса. – DaveStance

3

я обнаружил ответ на мой собственный запрос. Как оказалось, начиная с версии 2.1.3, которую я использовал, shortestPath в настоящее время не поддерживает фильтрацию свойств отношений. Тем не менее, существует несколько более дорогостоящее обходное решение. Обратите внимание, что это дороже в том смысле, что он немного менее эффективен, чем фильтр по индексированному свойству, возможно, был тем факультетом, который поддерживается Cypher, но он ни в коем случае не замедляется.

Вместо:

MATCH p = shortestPath((a:Party { currency: 'GBP' })-[:IN_ESCROW { 
    status: 'cleared' 
}]-(b:Party { currency: 'USD' })) 

Вы можете соответствовать shortestPath, а затем обеспечить соблюдение ограничений собственности путем использования предикатов, как так:

MATCH p = shortestPath((a:Party { currency: 'GBP' })-[r:IN_ESCROW] 
    -(b:Party { currency: 'USD' })) 
WHERE all(x IN r WHERE x.status = 'cleared') 

Недостаток здесь, очевидно, что мы первые сопоставления на все возможные кратчайшие пути через: IN_ESCROW отношения между двумя согласованными узлами и затем фильтрацию, чтобы гарантировать, что все отношения содержат ожидаемое свойство. Лично я считаю это поведение менее интуитивным. Кажется, что функция shortestPath может ранее исключать желаемые результаты просто потому, что она слепо следит за типом отношения, но в диком этом запросе работает так, как мне было нужно.

До сих пор это вел себя как ожидалось. Будем надеяться, что Neo4j проложит сильный синтаксис для скорого совпадения свойств в отношениях!

Смежные вопросы