Neo4j 似乎无法找到简单路径模式的匹配项
Neo4j can't seem to find a match for a simple path pattern when it should
我正在尝试一些 neo4j (3.4.9),我有一个我认为应该有效但奇怪的是无效的查询。
前两个查询有效(如图所示)。他们的结果向我建议,第三个应该至少 return 一个结果,但它 returns none.
为什么第三个查询没有像我预期的那样工作?
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>
我希望(至少)看到 "Old Street" - "London" - "Limehouse" 匹配 returned.
谢谢。
-- 写下并接受了Dave Bennett和Guy Coder提出的方案
问题在于我加载数据的方式。
之前,我使用以下方式加载它:
使用 HEADERS 从 "file:///estimates-of-station-usage-2016-17.csv" AS 行加载 CSV
创造东西
然而,这意味着许多节点被复制并具有相同的属性,因此它们是不同的但不能立即区分。
为避免此问题,仅对您知道唯一的节点使用 CREATE,然后使用 MERGE 创建将 link 其他节点在一起的节点。
我的 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;
-- 感谢 Dave Bennett 和 Guy Coder 的有益评论。
有关 CSV 数据的附注:
CSV文件中的字段都是简单的字符串。在解析站的 entriesAndExits 计数时有很多代码噪音,因为该列的条目是格式化为字符串的数字,包括多余的空格和逗号以分隔 3 位数字组,例如,“ 546,123 ”。
我正在尝试一些 neo4j (3.4.9),我有一个我认为应该有效但奇怪的是无效的查询。
前两个查询有效(如图所示)。他们的结果向我建议,第三个应该至少 return 一个结果,但它 returns none.
为什么第三个查询没有像我预期的那样工作?
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>
我希望(至少)看到 "Old Street" - "London" - "Limehouse" 匹配 returned.
谢谢。
-- 写下并接受了Dave Bennett和Guy Coder提出的方案
问题在于我加载数据的方式。
之前,我使用以下方式加载它:
使用 HEADERS 从 "file:///estimates-of-station-usage-2016-17.csv" AS 行加载 CSV 创造东西 然而,这意味着许多节点被复制并具有相同的属性,因此它们是不同的但不能立即区分。
为避免此问题,仅对您知道唯一的节点使用 CREATE,然后使用 MERGE 创建将 link 其他节点在一起的节点。
我的 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;
-- 感谢 Dave Bennett 和 Guy Coder 的有益评论。
有关 CSV 数据的附注:
CSV文件中的字段都是简单的字符串。在解析站的 entriesAndExits 计数时有很多代码噪音,因为该列的条目是格式化为字符串的数字,包括多余的空格和逗号以分隔 3 位数字组,例如,“ 546,123 ”。