“neo4j”;试一试;创建与节点的关系的步骤
如何编写下一个cyhper查询而不出错“neo4j”;试一试;创建与节点的关系的步骤,neo4j,cypher,Neo4j,Cypher,如何编写下一个cyhper查询而不出错 Match (n: {id :"someid"}),(x {id:"otherId"}) OPTIONAL MATCH (n)-[]->(t:Other) merge x-[]->(t)` 问题是,t将为空,并且我将得到一个错误: 期望在t处找到节点,但未找到任何节点(null) 这是完整的查询: MATCH (traveler:${labels.N_TRAVELER} {id: {traveler}.id}) OPTION
Match (n: {id :"someid"}),(x {id:"otherId"})
OPTIONAL MATCH (n)-[]->(t:Other)
merge x-[]->(t)`
问题是,t
将为空,并且我将得到一个错误:
期望在t处找到节点,但未找到任何节点(null)
这是完整的查询:
MATCH (traveler:${labels.N_TRAVELER} {id: {traveler}.id})
OPTIONAL MATCH (traveler)-[r:${labels.R_TRAVELER_LATEST_EVENT}]->(prev:${labels.N_EVENT})
OPTIONAL MATCH (interest:${labels.N_INTERESTS}) WHERE interest.id IN {interests}
DELETE r
MERGE (traveler)-[:${labels.R_TRAVELER_LATEST_EVENT}]->(trip:${labels.N_TRIP_EVENT})
ON CREATE SET trip={trip}
MERGE (traveler)-[:${labels.R_TRAVELER_WRITE_TRIP}]->(trip)
MERGE (trip)-[:${labels.R_TRIP_INTEREST}]->(interest)
WITH trip, collect(prev) as prevs
UNWIND prevs as prev
MERGE (trip)-[:${labels.R_EVENT_PREV_EVENT}]->(prev)
WITH trip
RETURN properties(trip) as trip`
所有的标签。
都只是字符串{interests}
是一个ID数组
基本上,我想创建一个trips的链接列表。第一个解决方案是只使用MATCH,如果没有
t
节点,它将停止查询
MATCH (n {id:"someid"}), (x {id:"otherId"})
MATCH (n)-->(t:Other)
MERGE (x)-[:RELATIONSHIP]->(t)
第二种解决方案是,如果此查询部分是更大查询的一部分,并且您需要在以后做一些事情,则收集t,如果为null,则收集将为空,因此您只能在它包含元素时进行迭代:
MATCH (n {id:"someid"}), (x {id:"otherId"})
OPTIONAL MATCH (n)-->(t:Other)
WITH n, x, collect(t) as ts
UNWIND ts as t
MERGE (x)-[:RELATIONSHIP]->(t)
WITH n, x
// continue query
下面是我用来处理可选的
合并的解决方法:
MATCH (n {id:"someid"}), (x {id:"otherId"})
OPTIONAL MATCH (n)-->(t:Other)
FOREACH(y IN CASE WHEN t IS NULL THEN [] ELSE [1] END | MERGE (x)-[:RELATIONSHIP]->(t));
如果t
不是NULL
,FOREACH
将只执行MERGE
操作。。但没有比这更优雅的解决方案了?比如merge,其中t不是null或者类似的东西?目前Cypher缺少一些条件,我相信它会出现。恐怕我现在看不到更优雅的东西有些不对劲。。正在创建关系,但在此之后,我使用n执行,返回n
,并返回空。。有什么想法吗?你能粘贴你现在尝试的完整查询吗?是否创建了链接列表?谢谢,这是可行的,但我发现问题与以前一样。。我可以返回x
它总是空的。。有什么想法吗?使用neo4j 3.0,如果创建一些最小的测试数据并使用RETURN x
结束我的查询,我总是会得到x
返回。即使可选匹配失败,也会出现这种情况。你用的是什么neo4j版本。我使用foreach循环运行与问题中相同的查询我的查询与问题中的第一个查询相同,除了foreach
子句。