2013-11-27 5 views
-1

Мне нужна помощь по определенному запросу. Я использую neo4j. Моя база данных состоит из компаний (узлов) и транзакций между ними (отношения). Каждая связь (ПЛАТНАЯ) обладает свойствами: для суммы выплачивается сумм сделки года - год сделки месяца - месяц сделкиконкретный запрос с cypher

Что мне нужно, чтобы найти все циклы в графе, начиная с узлом А. также должно быть верно, что транзакция произошла одна за другой.

В качестве примера можно привести ПИАТ B в марте, B PAID C в апреле, C PAID A в июне.

Итак, есть ли способ получить все циклы от узла A, чтобы транзакции происходили в непрерывном порядке?

ответ

0

Возможно, вы захотите установить примерный график в Neo4j console, чтобы поделиться или хотя бы рассказать больше о том, какую версию Neo4j вы используете, но если вы используете 2.0, и если вы сохраняете год и месяц как длинный или целый, то, возможно, вы могли бы попробовать что-то вроде

MATCH a-[ab:PAID]->b-[bc:PAID]->c-[ca:PAID]->a 
WHERE (ab.year + ab.month) > (bc.year + bc.month) > (ca.year + ca.month) 
RETURN a,b,c 

EDIT: на самом деле это было поспешным, дополнения не будут работать таким образом, конечно, но структура должна быть в порядке. Может быть,

WHERE ((ab.year > bc.year) or (ab.year = bc.year AND ab.month > bc.month)) 
    AND ((bc.year > ca.year) OR (bc.year = ca.year AND bc.month > ca.month)) 

или

WHERE (ab.year * 12 + ab.month) > (bc.year * 12 + bc.month) > (ca.year * 12 + ca.month) 

Если вы используете только даты для этого типа сравнения, рекомендуется хранить их в качестве одного свойства, возможно, миллисекунды после «эпохи» 1/1 -70 GMT. Это делает сравнения очень легкими. Но если вам нужно часто возвращать и отображать даты, то их сохранение может иметь смысл.

EDIT2:
Я не могу придумать, как построить свое состояние «r1.date < r2.date» в шаблон, что означает сопоставление всех переменные циклов глубины, а затем отбрасывая некоторые (большинство) из них. Скорее всего, это станет дорогостоящим на большом графике, и вам может быть лучше построить плагин traversal или server, который может принимать сложные итеративные решения во время обхода. В версии 2.0, благодаря элегантной коллекции нарезку Уэса, вы можете попробовать что-то вроде этого

MATCH path=a-[ab:PAID*..10]->a 
WHERE ALL (ix IN range(0,length(ab)-2) 
    WHERE ((ab[ix]).year * 12 +(ab[ix]).month)<((ab[ix+1]).year * 12 +(ab[ix+1]).month)) 
RETURN path 

То же самое, вероятно, может быть достигнуто в 1,9 с HEAD() и TAIL(). Опять же, поделитесь данными примера в консоли и, возможно, кто-то еще может подать.

+0

Я использую neo4j 1.9. Этот запрос в порядке, но он предназначен только для циклов, содержащих три узла, есть ли способ сделать его универсальным, поэтому один запрос возвращает все циклы всех размеров, а не только размер 3? – user3041466

+0

Вы до сих пор не поделились образцовым графом или сведениями о своей модели или о том, что вы пробовали до сих пор. Если это слишком много работы, вы можете захотеть заплатить за поддержку. – jjaderberg

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