Похоже, что Neo4j не может найти совпадение для простого шаблона пути - PullRequest
0 голосов
/ 01 ноября 2018

Я пытаюсь использовать neo4j (3.4.9), и у меня есть запрос, который, как мне кажется, должен работать, но, как ни странно, не работает.

Первые два запроса работают (как показано). Их результаты подсказывают мне, что третий должен по крайней мере вернуть один результат, и все же он не возвращает ни одного.

Почему третий запрос не работает так, как я ожидаю?

neo4j> MATCH (s:Station {name: "Old Street"})-[:IN_REGION]->(r:Region)
       RETURN r.name,s.name;
+-------------------------+
| r.name   | S.name       |
+-------------------------+
| "London" | "Old Street" |
+-------------------------+

1 row available after 24 ms, consumed after another 3 ms
neo4j> MATCH (s:Station {name: "Limehouse"})-[:IN_REGION]->(r:Region)    
       RETURN r.name,s.name;
+------------------------+
| r.name   | s.name      |
+------------------------+
| "London" | "Limehouse" |
+------------------------+

1 row available after 22 ms, consumed after another 3 ms
neo4j> MATCH (a:Station {name: "Old Street"})-[:IN_REGION]->(r:Region)<-[:IN_REGION]-(b:Station)
       RETURN r.name,a.name,b.name;
0 rows available after 41 ms, consumed after another 2 ms
neo4j>

Я ожидаю увидеть (по крайней мере) возвращение матча "Олд Стрит" - "Лондон" - "Лаймхаус".

Спасибо.

- Написал и принял решение, предложенное Дейвом Беннеттом и Гаем Кодером.

1 Ответ

0 голосов
/ 01 ноября 2018

Проблема была в том, как я загружал данные.

Ранее я загружал его, используя:

ЗАГРУЗИТЬ CSV С ЗАГОЛОВКАМИ ИЗ "file: ///estimates-of-station-usage-2016-17.csv" AS line СОЗДАТЬ вещи Однако это означало, что многие узлы были продублированы с одинаковыми свойствами, так что они были различимы, но не сразу различались.

Чтобы избежать этой проблемы, используйте CREATE только для тех узлов, которые, как вы знаете, будут уникальными, затем используйте MERGE для создания узлов, которые будут связывать другие узлы вместе.

Код загрузки моего CSV изменен на:

LOAD CSV WITH HEADERS FROM "file:///estimates-of-station-usage-2016-17.csv" AS line
CREATE (s:Station {name: line.`Station Name` , entriesAndExits: toInteger(replace(trim(line.`1617 Entries & Exits`), ",", "")) })
MERGE (fo:FacilityOwner {name: coalesce(line.`Station Facility Owner`, "Unknown")})
MERGE (r:Region {name: coalesce(line.Region, "Unknown")})
MERGE (la:LocalAuthority {name: coalesce(line.`Local Authority`, "Unknown")})
MERGE (fo)-[:OWNS]->(s)
MERGE (la)-[:RESPONSIBLE_FOR]->(s)
MERGE (la)-[:IN]->(r)
MERGE (s)-[:IN]->(r)
MERGE (fo)-[:OPERATES_IN]->(r)
RETURN s,r,la,fo;

MATCH (s:Station)
WHERE NOT exists(s.name) OR NOT exists(s.entriesAndExits)
DETACH DELETE s
RETURN s;

MATCH (r:Region)
WHERE r.name = "Unknown"
DETACH DELETE r
RETURN r;

MATCH (fo:FacilityOwner)
WHERE fo.name = "Unknown"
DETACH DELETE fo
RETURN fo;

MATCH (la:LocalAuthority)
WHERE la.name = "Unknown"
DETACH DELETE la
RETURN la;

- Спасибо Дейву Беннетту и Гаю Кодеру за их полезные комментарии.

Примечание к данным CSV:

Поля в CSV-файле - это все простые строки. При анализе количества записей для станций имеется много кодового шума, поскольку записи этого столбца представляют собой числа, отформатированные в виде строк, включая лишние пробелы и запятые, для разделения групп из 3 цифр, например, «546,123».

...