0

我想找到没有关系的节点。所以我在寻找与当前节点实例有关系的节点时使用;

@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 运行它时,出现了问题。它不喜欢没有像 [r:KNOWS] 这样的别名的关系([: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子句中定义别​​名。MATCH我们可以在子句中定义它,但我们也不能NOT在匹配中使用运算符。

我如何NOT在 match 中使用运算符,因为它可以在WHERE. 或者有没有办法以spring-data-neo4j某种方式修复异常。

谢谢你!

4

2 回答 2

1

在我看来,该异常似乎说明了您声称是问题所在的另一件事。它抱怨根节点(ID = 0 的节点)没有 __type__ 属性,我相信这是 Spring 数据存储其内部信息以便能够从节点创建对象的地方。

检查你的根节点代表什么。如果您认为它不应该存在,请将其删除,然后重试。或者,如果它代表系统中的某个用户,请查看另一个用户节点,获取它为 __type__ 属性设置的任何值,并将相同的内容设置到根节点上。

于 2013-08-10T17:55:21.890 回答
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;

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

感谢米哈尔·巴赫曼。

于 2013-08-12T13:37:02.233 回答