Neo4j: ГДЕ НЕ возвращает неверные узлы - PullRequest
0 голосов
/ 31 августа 2018

При выполнении этого запроса:

MATCH (profile:Profile)
MATCH (profile)-[:INTERACTION]->(i)
WHERE NOT 'foo' IN i.content
RETURN DISTINCT profile

Neo возвращает profile узлы с :INTERACTION отношениями, которые имеют i.content = foo, хотя я и указывал WHERE NOT.

INTERACTION структура узла выглядит следующим образом:

[{
  "content": String
}]

Я пропустил шаг?

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

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

Вы запросили: узлы профиля, которые имеют: отношение взаимодействия с узлом без 'foo' в его свойстве содержимого.

Это полностью отличается от запроса: узлы профиля, которые не имеют никакого отношения к узлу с 'foo' в его свойстве содержимого.

Есть несколько способов получить то, что вы хотите

MATCH (profile:Profile)
OPTIONAL MATCH (profile)-[:INTERACTION]->(i)
WHERE 'foo' IN i.content
WITH profile
WHERE i IS NULL
RETURN profile

или

MATCH (profile:Profile)
WITH profile,  [(profile)-[:INTERACTION]->(i) WHERE 'foo' IN i.content | i] as fooInteractions
WHERE size(fooInteractions) = 0
RETURN profile

Также, как отметил cybersam, вы используете ключевое слово IN, которое предназначено для проверки членства в списке, но вы указали, что у вас есть значения, такие как i.content = 'foo', поэтому вы можете неправильно использовать это.

Если так, то это сделает правильный запрос намного проще, чем приведенные выше:

MATCH (profile:Profile)
WHERE NOT (profile)-[:INTERACTION]->(i {content:'foo'})
RETURN profile

И, как отметили в cybersam, ваша формулировка предполагает, что, возможно, вы действительно хотите проверить свойство content отношения: ВЗАИМОДЕЙСТВИЕ. Если это действительно то, что вам нужно, то вместо этого переместите {content:'foo'} в отношение: ВЗАИМОДЕЙСТВИЕ в шаблоне.

0 голосов
/ 31 августа 2018

Ключевое слово IN используется только для проверки, является ли значение членом списка. Например: 5 В [1,2,3] .

Для проверки на включение в строку есть несколько вариантов. Одним из вариантов является использование ключевого слова CONTAINS ; например: i.content СОДЕРЖИТ 'foo' .

ПРИМЕЧАНИЕ. В вашем запросе i - это переменная для узла, а не связь. Вы на самом деле пытаетесь проверить свойство контента отношений? Пожалуйста, исправьте свой вопрос, так как вы в настоящее время используете термины «узел» и «отношения» взаимозаменяемо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...