2013-10-12 3 views
1

Я создал одну структуру графа .of них есть некоторые отношения следующим образомNeo4j: Multiple сказуемое фильтры

Fever --causes--> Malaria , Fever --causes--> dehydration 
Flu --causes--> Malaria , Flu --causes--> SwineFlu 

Теперь я хочу написать Cypher запроса, который возвращает пересечение причин лихорадки и грипп, Средства здесь продукция должна быть малярией.

Я пишу следующий запрос, но он не дает мне никаких узлов.

START aa=node(*) MATCH (aa)-[:causes]->(symptoms) 
WHERE (aa.Name = "Fever") AND (aa.Name = "Flu") RETURN distinct symptoms; 

Любая помощь будет оценена!

+0

нео версия? есть ли у вас какие-либо индексы, которые выглядят? –

+0

Нет, нужны ли индексы, потому что, когда я ищу причины по лихорадке, это дает мне правильные результаты. – pawan9977

+0

У вас должен быть указатель на Name, поэтому вам не нужно сканировать граф, чтобы найти его. Вы используете нео 1.9 или 2.0? Причина, по которой вы не получаете никаких результатов, состоит в том, что у вас никогда не будет двух разных значений для aa.Name в том же промежуточном результате, поэтому вам нужно либо использовать OR, либо считать их, либо если вы хотите только найти эти результаты, их нужно подбирать отдельно. –

ответ

3

Попробуйте использовать OR вместо AND в вашей статье WHERE.

Edit:

Я думаю, что есть две части два его.

Во-первых, для вашего «пересечения причин» вы должны указать шаблон, который выражает это пересечение. Подумайте об этом, указав точно, какие данные вы хотите вернуть, а затем откройте или обобщите те части шаблона, которые вы хотите заполнить, в зависимости от того, что находится на вашем графике. Если я правильно понимаю вашу модель и ваше намерение это сделало бы картину, как

(fever)-[:CAUSES]->(malaria)<-:[CAUSES]-(flu) 

Идентификаторы узлов являются только заполнители, но пусть они представляют, что вы уже знаете, что грипп и лихорадка оба имеют отношение этого типа к малярия. Тогда, если вы хотите спросить: «Что это за отношения, связанные с гриппом и лихорадкой?» вы можете обобщить его как

(fever)-[:CAUSES]->(unknown)<-[:CAUSES]-(flu) 

Сами по себе эти модели идентичны для шифром, но так как вы предоставите два известных узлов, узел гриппа и узел лихорадки, и вы знаете, что вы хотите что-то они имеют в общем в соответствии к определенному отношению, то вы можете объявить именно этот шаблон и оставить только неизвестный узел, который является общим.

Во-вторых, вам нужно заполнить этот шаблон узлами, которые вы уже знаете. Если бы вы соответствовали шаблону, так как это были только известные его части, являющиеся типом и направлением отношений, вы могли бы найти все триплеты узлов, связанных таким образом. Поэтому, если вы хотите, чтобы этот шаблон соответствовал только гриппу и лихорадке, вам необходимо предоставить или заполнить эти узлы в шаблоне. Обычно вы будете делать это с помощью индекса просмотров (до 2,0 не Выпущенный в любом случае), как

START flu=node:Symptom(name="Flu"), fever=node:Symptom(name="Fever") 

, а затем продолжить шаблон в пункте MATCH. Таким образом, шаблон заполняется полностью, за исключением одного неизвестного узла, который вы ищете. (Обратите внимание, что вы можете заполнить местозаполнитель в шаблоне мешком узлов, а также отдельными, но эта часть шаблона по-прежнему принадлежит тому, что предусмотрено в шаблоне.) Если у вас нет индексов, вы можете заполнить заполнители для гриппа и лихорадки с «всеми узлами», а затем предоставляют дополнительные критерии фильтрации. Это плохо, но это работает.

START flu=node(*), fever=node(*) 
MATCH (flu)-[:CAUSES]->(unknown)<-[:CAUSES]-(fever) 
WHERE flu.Name="Flu" AND fever.Name="Fever" 
RETURN DISTINCT unknown 
+0

Тогда это дает мне причины только лихорадкой. – pawan9977

+0

Любые предложения, пожалуйста ... – pawan9977

+0

Прошу прощения, мой ответ был таким коротким, я попытался ответить чуть более подробно. Если у вас все еще есть проблемы, пожалуйста, подумайте о том, чтобы настроить образец диаграммы на [console.neo4j.org] для людей, на которые нужно смотреть. – jjaderberg

2

Вы могли бы сделать что-то вроде этого:

START aa=node(*) 
MATCH aa-[:causes]->symptom 
WITH collect(aa.name) AS aa, symptom 
WHERE ALL (x IN ['Fever' , 'Flu'] 
      WHERE x IN aa) 
RETURN symptom 

http://console.neo4j.org/r/7awspi

Но в идеале вы бы индексный поиск, подобный этому.

START aa=node:node_auto_index('name:("Fever", "Flu")') 
MATCH aa-[:causes]->symptom 
RETURN symptom, count(*) 
ORDER BY count(*) DESC 

http://console.neo4j.org/r/bawo5d

+0

также, я думаю, ваши отношения назад. Конечно, лихорадка не вызывает малярию. :) (на самом деле это не так важно, за исключением людей, которые смотрят на модель.) –

+0

Фантастический .. Спасибо, что так много .. Это сработало .. – pawan9977

+1

Добавили графику на этот http: //gist.neo4j. org /? 7010105 для справки. Не стесняйтесь уточнять. –

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