Neo4j can';当一个简单的路径模式应该匹配时,它似乎找不到匹配

Neo4j can';当一个简单的路径模式应该匹配时,它似乎找不到匹配,neo4j,pattern-matching,cypher,graph-databases,Neo4j,Pattern Matching,Cypher,Graph Databases,我正在尝试一些neo4j(3.4.9),我有一个我认为应该可以运行的查询,但奇怪的是没有 前两个查询确实有效(如图所示)。他们的结果向我建议,第三个应该至少返回一个结果,但它不返回任何结果 为什么第三个查询没有像我期望的那样工作 neo4j> MATCH (s:Station {name: "Old Street"})-[:IN_REGION]->(r:Region) RETURN r.name,s.name; +-------------------------+ |

我正在尝试一些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>
neo4j>匹配(s:Station{name:“Old Street”})-[:IN_REGION]->(r:REGION)
返回r.name,s.name;
+-------------------------+
|r.name | S.name|
+-------------------------+
|“伦敦”|“老街”|
+-------------------------+
24毫秒后有1行可用,3毫秒后消耗
neo4j>匹配(s:Station{name:“Limehouse”})->(r:REGION)
返回r.name,s.name;
+------------------------+
|r.name | s.name|
+------------------------+
|“伦敦”|“石灰房”|
+------------------------+
22毫秒后有1行可用,3毫秒后消耗
neo4j>匹配(a:Station{name:“Old Street”})->(r:REGION)
我希望(至少)看到“老街”——“伦敦”——“Limehouse”的比赛重新开始

谢谢


--撰写并接受了Dave Bennett和Guy Coder提出的解决方案。

问题在于如何加载数据

之前,我使用以下方式加载它:

从“加载带有标题的CSV”file:///estimates-of-station-usage-2016-17.csv“作为一条线 创造东西 然而,这意味着许多节点是用相同的属性复制的,因此它们是不同的,但不能立即区分

要避免此问题,请仅对已知唯一的节点使用“创建”,然后使用“合并”创建将其他节点链接在一起的节点

我的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位数字组,例如,“546123”.

尝试相同的查询,但使用
-
而不是
->
您可以尝试
匹配(r:Region{name:'London'})返回计数(r)作为londons
np,因此,如果我读得正确,看起来您有330个不同的区域节点名为*“London”*。我本来希望有一个单一的区域节点(或者考虑到伦敦有很多个节点),但不是330。我想说的是,“老街”和“Limehouse”很可能与名为“伦敦”的不同节点相连。戴夫之前的评论似乎是正确的。出于好奇,搜索路径返回什么,
匹配(n:Station{name:“Old Street”}),(m:Station{name:“Limehouse”}),p=最短路径((n)-(r*]-(m))返回n.name,p,m.name这可能不是一个有效的查询,但它应该接近正确。如果您需要在注释中输入的某些响应效果不好或不适合注释,则可以通过添加新的部分来编辑您的问题,记下注释,然后将响应添加到原始问题中。让每个人的生活更轻松。:)