2015-09-06 3 views
2

Cypher newb здесь, который, вероятно, не может получить мою голову из «мышления в SQL»:Cypher: Синтаксис ярлыков - используйте «ИЛИ», ограничивая узлы ярлыками?

Скажем, у меня есть график персонажей Звездных войн и их детей (и их детей и т. Д.).

У меня есть отношения между родителем и ребенком. Если я хочу вернуть узлы все потомство Анакина Скайуокера (в том числе и его тоже), я мог бы сделать это:

MATCH (x:Person {name:"Darth Vader"})-[:CHILD_OF*1..3]-(y) 
RETURN x,y 

Что делать, если я хочу, чтобы сравнить потомство двух персонажей, правда? Скажем, я хочу увидеть икру и Анакина, и отвратительного Джара Джара Бинкса. Есть ли способ по существу ИЛИ ограничение метки?

MATCH (x:Person {name:"Darth Vader | "Jar Jar"})-[:CHILD_OF*1..3]-(y) 
RETURN x,y 

Номер

MATCH (x:Person {name:("Darth Vader", "Jar Jar")})-[:CHILD_OF*1..3]-(y) 
RETURN x,y 

Неудача.

MATCH (x:Person {name:"Darth Vader"} OR {name: "Jar Jar"})-[:CHILD_OF*1..3]-(y) 
RETURN x,y 

Печаль.

Или НЕОБХОДИМО использовать WHERE условие (которое нарушило бы [: CHILD_OF * 1..3]?, Правильно я полагаю, ГДЕ будет применяться ранее [: CHILD_OF1..3]? Получает оценку)

Большое спасибо.

+0

Вы имеете в виду этикетки или свойства? 'name' в вашем примере является свойством,': Person' является меткой. – jjaderberg

+0

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

ответ

2

Да, вам необходимо использовать статью WHERE. И это не должно нарушать переменную длину пути:

MATCH (x:Person)-[:CHILD_OF*1..3]-(y) 
WHERE x.name IN ['Darth Vader', 'Jar Jar'] 
RETURN x, y 

Neo4j достаточно умен, чтобы знать, что вы говорите «начать с x, который соответствует этим критериям, а затем формируют путь оттуда». Синтаксис JSON соответствует синтаксическому сахару для простого совпадения совпадений WHERE и может использоваться только для строгого равенства.

Если вы хотите знать, как отсоединен x и y являются или увидеть узлы/отношения между ними можно определить переменную пути:

MATCH path=(x:Person)-[:CHILD_OF*1..3]-(y) 
WHERE x.name IN ['Darth Vader', 'Jar Jar'] 
RETURN x, path, nodes(path), rels(path), y 

EDIT:

Если это помогает, другой способ сделать это/подумать об использовании WITH:

MATCH (x:Person) 
WHERE x.name IN ['Darth Vader', 'Jar Jar']) 
WITH x 
MATCH (x)-[:CHILD_OF*1..3]-(y) 
RETURN x,y