在MATCH中不是运算符

时间:2013-08-10 14:36:18

标签: neo4j spring-data-neo4j

我想找到不存在关系的节点。所以我正在使用,而我正在寻找与当前节点实例的关系中的节点,如;

@Query(value = "start user=node({self}) match (user)<-[r:KNOWS]-(known) return known")
@Fetch
private Iterable<GraphUser> knowsMe;

但是当我试图找到不知道当前节点的节点时,我找到了一个解决方案就像是;

    @Query(value = "start user=node({self}), doesNotKnowMe=node(*) where has(user.userId) and NOT((user)<-[:KNOWS]-(doesNotKnowMe))  return doesNotKnowMe")
    @Fetch
    private Iterable<GraphUser> doesNotKnowMe;

当我运行这个neo4j在线执行器时,它运行良好。(http://www.neo4j.org/learn/cypher) 我在网站上使用的样本就像;

START m=node:node_auto_index(id="603"), actor=node(*) 
WHERE HAS (actor.name) AND NOT ((m)<-[:ACTS_IN]-(actor)) 
RETURN actor

注意:要获得结果,您应该放置一个与电影无关的节点。如果它退出,查询将导致您添加的记录。

当我想用spring-data-neo4j运行时,会出现问题。它不喜欢关系([:KNOWS])没有像[r:KNOWS]那样的别名。

例外:

Caused by: org.neo4j.graphdb.NotFoundException: '__type__' property not found for NodeImpl#0.
    at org.neo4j.kernel.impl.core.Primitive.newPropertyNotFoundException(Primitive.java:184)
    at org.neo4j.kernel.impl.core.Primitive.getProperty(Primitive.java:179)
    at org.neo4j.kernel.impl.core.NodeImpl.getProperty(NodeImpl.java:52)
    at org.neo4j.kernel.impl.core.NodeProxy.getProperty(NodeProxy.java:155)
    at org.springframework.data.neo4j.support.typerepresentation.AbstractIndexingTypeRepresentationStrategy.readAliasFrom

但是您可能知道,我们无法在WHERE子句中定义allias。我们可以在MATCH子句中定义它,但我们也不能在匹配中使用NOT运算符。

如何在匹配中使用NOT运算符,因为它可以在WHERE中使用。或者有办法以某种方式解决spring-data-neo4j异常。

谢谢!

2 个答案:

答案 0 :(得分:1)

在我看来,好像异常说的是你声称是问题的另一件事。它抱怨根节点(ID = 0的节点)没有__type__属性,我相信Spring数据存储其内部信息,以便能够从节点中创建对象。

检查根节点代表的内容。如果你不认为它应该在那里删除它,然后再试一次。或者,如果它表示类似系统中的用户,请查看另一个用户节点,获取它对__type__属性的任何值,并将相同的内容设置到根节点上。

答案 1 :(得分:0)

正如Micheal Bachman所说,我一直在检查对象是否有userId。缺少的部分是has(doesNotKnowMe.userId)。因此,我保证即使存在另一个类型节点,节点也将是我的模型。

    @Query(value = "start user=node({self}), doesNotKnowMe=node(*) where has(user.userId) and has(doesNotKnowMe.userId) and NOT((user)<-[:KNOWS]-(doesNotKnowMe))  return doesNotKnowMe")
    @Fetch
    private Iterable<GraphUser> doesNotKnowMe;

因此,我可以获得与上述查询无关的节点。

感谢Michal Bachman。