我是Neo4j的新手,我正在尝试构建一个工具,该工具允许UI上的用户从本质上指定他们要查询neo4j的节点的路径。对于路径中的每个节点,他们可以指定节点的特定属性,并且通常它们并不关心关系类型/属性。这些关系的长度必须可变,因为它们的典型用例是它们具有一个起始节点,并且他们想知道它是否到达某个末端节点,而不关心起始和末端之间的(所有)中间节点。>
用户在从UI构建路径时遇到的一些限制是:它不能有循环,不能有多个子节点的节点有多个子节点,节点不能有一个以上的传入边。仅从他们的角度来看这是强制执行的,而不是在查询本身中执行。
我遇到的问题是能够在路径的每个级别上指定过滤,而不会出现奇怪的行为。
我已经尝试了Cypher查询的多种变体,例如将路径分解为多个MATCH语句,修改关系以及其他我能想到的东西。
这里是示例密码转储的要点 cypher-dump
此查询为我提供了我要获取的路径,但未在n_four上指定名称或类型。
SELECT COUNT(volunteer_id),shift_id FROM rota
WHERE volunteer_id IN(
SELECT volunteer_id
FROM (
SELECT COUNT(shift_id) c FROM rota GROUP BY volunteer_id
) as tmp WHERE c=6
)
GROUP BY shift_id
该查询是我想要的工作,但是它遗漏了我难以理解的第三级叶子。
MATCH path = (n_one)-[*0..]->(n_two)-[*0..]->(n_three)-[*0..]->(n_four)
WHERE n_one.type IN ["JCL_JOB"]
AND n_two.type IN ["JCL_PROC"]
AND n_three.name IN ["INPA", "OUTA", "PRGA"]
AND n_three.type IN ["RESOURCE_FILE", "COBOL_PROGRAM"]
RETURN path
我注意到的是,当我在查询中“ ... RETURN n_four”时,它也包含了第三级的节点。
答案 0 :(得分:1)
此行为是由您(可能不适当)在您的[*0..]
模式中使用MATCH
引起的。
仅供参考:
[*0..]
匹配0个或更多关系。例如,即使(a)-[*0..]->(b)
和a
是同一个节点,b
也会成功(并且该节点与其自身没有关系)。
默认下限为1。因此[*]
等效于[*..]
和[*1..]
。
您的2个查询使用相同的MATCH
模式,以...->(n_three)-[*0..]->(n_four)
结尾。
您的第一个查询没有为WHERE
指定任何n_four
测试,因此查询可以自由返回其中n_three
和n_four
是< em>相同的节点。这种缺乏特异性的原因就是查询能够返回2个额外的节点的原因。
您的第二个查询为WHERE
指定了n_four
测试,这使得n_three
和n_four
不可能是同一节点。现在查询更加挑剔,因此不再返回这两个额外的节点。
除非确定要有选择地匹配0个关系,否则不应使用[*0..]
。它还可能会增加不必要的开销。而且,正如您现在所知道的,它也使查询变得有些棘手。