我有一个neo4j数据库,具有以下内容:
a:Foo
b:Bar
Run Code Online (Sandbox Code Playgroud)
大约10%的db有 (a)-[:has]->(b)
我只需要获得那些没有这种关系的节点!
以前做的事情()-[r?]-()
会很完美!然而,它不再受支持:(而是,正如他们建议的那样
OPTIONAL MATCH (a:Foo)-[r:has]->(b:Bar) WHERE b is NULL RETURN a
Run Code Online (Sandbox Code Playgroud)
给我一个null结果,因为可选匹配需要BOTH节点在那里或BOTH节点不在那里......
那么如何获得所有未a:Foo
附加的节点b:Bar
?
注意:数据集是数百万个节点,因此查询需要高效或以其他方式超时.
我有以下两种节点类型:
c:City {name: 'blah'}
s:Course {title: 'whatever', city: 'New York'}
Run Code Online (Sandbox Code Playgroud)
想要创造这个:
(s)-[:offered_in]->(c)
Run Code Online (Sandbox Code Playgroud)
我试图让所有与城市无关的课程与城市建立关系(如果不存在,城市就会被创造).然而,问题是我的数据集大约有500万个节点,并且我做出的任何查询超时(除非我增加10k).
......有人有什么建议吗?
编辑:
这是我现在正在运行的作业的查询(必须以10k块(数百万)完成,因为它需要几分钟.如果不存在则创建城市):
match (j:Job)
where not has(j.merged) and has(j.city)
WITH j
LIMIT 10000
MERGE (c:City {name: j.city})
WITH j, c
MERGE (j)-[:in]->(c)
SET j.merged = 1
return count(j)
Run Code Online (Sandbox Code Playgroud)
(现在不知道过滤掉已经匹配的好方法,所以试着用自定义"merged"属性标记它,我已经有了索引)
我有2个节点类型,可以说"学生"和"老师"类型
Student have {id, name}.
Teacher have {id, name}.
Run Code Online (Sandbox Code Playgroud)
学生可以与班级节点建立可选关系,作为"教学".
(t:Teacher)-[r:TEACHES]->(c:Student).
[r:TEACHES] - Optional relationship. (present or may not present)
Run Code Online (Sandbox Code Playgroud)
我想找到没有老师的"学生"节点.即没有任何传入关系"教学"
请帮忙.