【问题标题】:Neo4j / Cypher query based on two unrelated nodes returning one result基于返回一个结果的两个不相关节点的 Neo4j / Cypher 查询
【发布时间】:2013-07-16 00:19:00
【问题描述】:

下面是我的上下文的概念示例:

我有一个抽象类,名为:User(包含 id 属性作为字符串)
我有一个名为 User 的子类:FacebookUser
我有一个User 子类,名为:TwitterUser

使用 Spring-Data-Neo4j,我将 User 设为 @NodeEntity

我创建了一个测试类,以便在图表中插入 FacebookUserTwitterUser
整个井发生 => 两个节点都已插入,并且有一个 _type_ 包含子类的完全限定名称。
例如:com.myApp.model.user.FacebookUser

现在,我想进行这种密码查询:
检索 id = 123 的用户
因此,我必须找到更有效的方法来检查所有用户节点(FacebookUsers 和TwitterUser 的联合),以便找到唯一的对应记录。

我希望找到一种方法来告诉密码这样的事情:
获取每个匹配 FacebookUser 的索引,每个匹配 TwitterUser 的索引,并检查其中的预期节点

但我没有做到。

我当前的查询是:

@Query("start u=node(*) where has(u.__type__) and u.__type__ =~ '.*User' and has(u.id) and u.id = {0} return u")

这个翻译成:

检查图中的所有节点(我想,一点效率都没有),然后保留那些以“User”结尾的节点(包括 FacebookUser 和 TwitterUser)并检查正确的id

有没有办法在这种情况下只使用索引节点,而不是扫描整个图?

我正在考虑将 _type_ 属性重命名为父类的完整限定名的方法。

我们可以使用 SDN 轻松做到这一点吗?

确实,由于 SDN 似乎使用与节点关联的 Java 类名称作为节点的索引名称,因此它只允许处理 Facebook 和 Twitter 子类型的一个索引节点:用户 索引节点。

【问题讨论】:

    标签: neo4j cypher spring-data-neo4j


    【解决方案1】:

    如果你在类上使用@Indexed,你应该得到像 TwitterUser 等的索引,然后你可以在你的查询中使用它们。但是,继承方法存在一些限制,相关讨论请参见 Spring Data Neo4j - Indexing and Inheritance

    【讨论】:

    • 但实际上,我想检索 FacebookUser 和 TwitterUser 的联合,匹配一些属性,如 Id(在本例中为 singleResult)。我正在考虑在我的用户基类中添加一个属性,例如:“isUser”。这将被索引(使用@Indexed),并在我的查询中使用,以便直接访问(识别)与用户(Facebook 和 Twitter 用户的联合)对应的节点,从而避免扫描整个图。 type 仅用于检索类的类型,以便处理到 Java 的映射。这会是一个有效的解决方案吗?谢谢:)
    • 想说__类型__不是类型
    • 我认为这样就可以了。测试一下!
    猜你喜欢
    • 2013-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-13
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 2016-04-15
    相关资源
    最近更新 更多