2017-01-26 2 views
2

У меня есть большой график, в котором некоторые из отношений имеют свойства, которые я хочу использовать, чтобы эффективно обрезать график при создании подграфа. Например, если у меня есть свойство с именем 'relevance score', и я хочу начать с одного узла и разрастаться, собирая все узлы и отношения, но обрезая везде, где отношения имеют вышеуказанное свойство.Как найти конкретный подграф в Neo4j, используя where where

Моя попытка сделать сетчатой ​​этот запрос:

start n=node(15) match (n)-[r*]->(x) WHERE NOT HAS(r.relevance_score) return x, r 

Моя попытка имеет две проблемы, которые я не могу постановляю:

1) Размышляя Я считаю, что это не приведет к обрезанной графа, а скорее коллекция непересекающихся графов. Дополнительно:

2) Я получаю следующее сообщение об ошибке от того, что выглядит правильно сформирован высчитывать запрос:

Type mismatch: expected Any, Map, Node or Relationship but was Collection<Relationship> (line 1, column 52 (offset: 51)) 
"start n=node(15) match (n)-[r*]->(x) WHERE NOT HAS(r.relevance_score) return x, r" 
+2

Какая версия Neo4j вы используете? ['START'] (https://neo4j.com/docs/developer-manual/3.0/cypher/#query-start) считается устаревшим и [' has'] (https://neo4j.com/docs/developer -manual/3.0/cypher/# where-property-exists) больше не поддерживается в 3.x. –

+0

3.0.6. Он по-прежнему работает, хотя для других запросов, но полезно знать. Я пропустил этот пункт в документах. – WildBill

ответ

3

Вы должны иметь возможность использовать функцию ALL() в совокупности отношений для обеспечения того, что для всех отношений в пути это свойство имеет значение null.

Используя примерный граф Gabor, этот запрос должен работать.

MATCH p = (n {name: 'n1'})-[rs1*]->() 
WHERE ALL(rel in rs1 WHERE rel.relevance_score is null) 
RETURN p 
+1

Спасибо, я об этом не думал. Небольшое замечание: вы должны вернуть 'p' вместо' path'. –

+0

Это работает, хотя я не могу получить никаких данных об отношениях. Я могу делать такие вещи, как «отношения (p)», но я возвращаю только свойства, и я могу получить такие вещи, как идентификатор или метки. – WildBill

+0

Я согласен с этим, но я открываю новый вопрос, так как мне нужны подробности о каждой части, но я этого явно не сказал. http://stackoverflow.com/questions/41895481/how-to-enumerate-nodes-and-relationships-along-path-returned-via-cypher был открыт для уточнения запроса. – WildBill

2

Одно из решений, что я могу думать о том, чтобы пройти через все взаимоотношения (с rs*), отфильтруйте те, у которых нет свойства relevance_score, и посмотрите, остается ли rs «путь» тем же. (Я процитировал «путь», как технически это не Neo4j path).

Я создал небольшой пример графа:

CREATE 
    (n1:Node {name: 'n1'}), 
    (n2:Node {name: 'n2'}), 
    (n3:Node {name: 'n3'}), 
    (n4:Node {name: 'n4'}), 
    (n5:Node {name: 'n5'}), 
    (n1)-[:REL {relevance_score: 0.5}]->(n2)-[:REL]->(n3), 
    (n1)-[:REL]->(n4)-[:REL]->(n5) 

График содержит один соответствующий край, между узлами n1 и n2.

enter image description here

Запрос (обратите внимание, что я использовал {name: 'n1'}, чтобы получить начальный узел, вы можете использовать START node=...):

MATCH (n {name: 'n1'})-[rs1*]->(x) 
UNWIND rs1 AS r 
WITH n, rs1, x, r 
WHERE NOT exists(r.relevance_score) 
WITH n, rs1, x, collect(r) AS rs2 
WHERE rs1 = rs2 
RETURN n, x 

Результаты:

╒══════════╤══════════╕ 
│n   │x   │ 
╞══════════╪══════════╡ 
│{name: n1}│{name: n4}│ 
├──────────┼──────────┤ 
│{name: n1}│{name: n5}│ 
└──────────┴──────────┘ 

Обновление: см. ответ InverseFalcon для более простого решения.

+0

Я разместил уточнение в примечаниях к ответу ниже. Любопытно, как я получаю больше данных о результирующих компонентах пути. – WildBill

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