我有x类型的节点和一些属性。 我正在尝试形成一个查询,检查x中是否存在给定的属性集,如果存在,则将每个属性与值进行比较,然后返回相关节点。 psuedo代码将是这样的: -
match(x)
if exist(x.a, x.b)
then if(x.a==1 and x.b==2)
return x
else if exist(x.a)
then if(x.a==1)
return x
else if exist(x.b)
then if(x.b==1)
return x
我试过了: -
MATCH (x) WHERE exists(x.a) and ('high' IN (x.a)) and exists(x.b) and ('high' IN (x.b)) RETURN x
和: -
match(x) where x.a='high' and x.b='high' return x
但这两个查询的问题是,如果说'a'不是x中的属性而'b'是,则它返回null而不至少根据'b'的值给出结果。我假设这是因为和条款,但我找不到替代方案。 我正在使用neo4j 3.1.3
答案 0 :(得分:1)
在这种情况下,UNION运算符将提供帮助,使查询类似于: -
match(x) where x.a='high' return x union match(x) where x.b='high' return x
从Tom上面的答案得到了这个想法!
答案 1 :(得分:0)
这可能有效:
CREATE (:X {a: "first a"})
CREATE (:X {a: "second a", b: "first b"})
CREATE (:X {b: "second b"})
MATCH (x:X)
WHERE exists(x.a)
AND exists (x.b)
AND <any other conditions>
RETURN x
UNION
MATCH (x:X)
WHERE exists(x.a)
AND NOT exists (x.b)
AND <any other conditions>
RETURN x
UNION
MATCH (x:X)
WHERE NOT exists(x.a)
AND exists (x.b)
AND <any other conditions>
RETURN x;
由于这三种情况都返回相同的东西,你可以指定三种情况并将它们联合起来。
希望这有帮助, 汤姆