我想找到不存在关系的节点。所以我正在使用,而我正在寻找与当前节点实例的关系中的节点,如;
@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
异常。
谢谢!
答案 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。