我正在尝试获取给定关系的字段匹配的所有实体(我希望在结果中填写我的实体的关系)。尝试在session.loadAll()上使用Filter来过滤关系的字段,但我无法使其正常工作。
我的实体定义如下:
@NodeEntity
class ClockAction {
@Id @GeneratedValue
private Long id;
private String description
private User user;
private Office office;
}
@NodeEntity
class User {
@Id @GeneratedValue
private Long id;
private String name;
private List<ClockAction> clockActions;
}
@NodeEntity
class Office {
@Id @GeneratedValue
private Long id;
private String name;
private List<ClockAction> clockActions;
}
因此,我需要检索User.id在给定ID中的所有ClockAction实体。
这是我的尝试:
Filter filter = Filter("id", ComparisonOperator.IN, userIds);
filter.setNestedPropertyName("user");
filter.setNestedPropertyType(User.class);
filter.setNestedRelationshipEntity(true);
return session.loadAll(ClockAction.class, filter);
这总是返回空结果。知道我在做什么错吗?
使用像这样的session.query
session.query(ClockAction.class, "MATCH p=(a:ClockAction)-[r]-() WHERE id(r) IN {ids} RETURN nodes(p), rels(p), a, r ORDER BY a.id", params)
有效,但只有ClockAction的office字段填写在结果实体上,用户始终为空...
我们将不胜感激:)
答案 0 :(得分:0)
首先要注意一些事情
:很遗憾,当前无法过滤id
字段,因为过滤器仅适用于属性。使用id
函数以密码查询id字段。 (id(n)
!= n.id
)
您不是要查找关系实体(删除filter.setNestedRelationshipEntity(true);
)
现在您可以选择:
使用过滤器查询User
类的另一个属性。
使用以下内容更改密码查询:"MATCH p=(a:ClockAction)-[r]-(n) WHERE id(n) IN {ids} RETURN nodes(p), rels(p), a, r ORDER BY a.id"
所做的更改是基于以下假设:代码段正确且User
不是关系。
其他信息(编辑): 如果未定义任何关系,Neo4j OGM将创建它们从您要保存的节点定向传出。您的图形可能如下所示(以ClockAction为根):
或者这样(用户作为具有多个ClockAction的root用户):
您没有得到Office
,因为您当前的查询路径是(:User)-[r]-(:ClockAction)
,路径中没有关于Office
的信息。
MATCH (n:User)-[ur:CLOCK_ACTIONS]->(c:ClockAction)-[or:OFFICE]->(o:Office) WHERE id(n) IN {ids} RETURN c, n, ur, o, or
是您可以使用的非常简单的查询。它删除了以路径为中心的样式,但还加载了您需要的所有数据。
如果图形是通过User
存储的,但这只是一个示例,可以应用,但是数据会显示在图形中,您不会在User
上看到任何ClockAction
信息因为它保存起来没有任何提示,所以Neo4j OGM还将期望从您要加载的类的传出方向上关联的数据。
现在,必须保留User
示例,将@Relationship(type="CLOCK_ACTION", direction = "INCOMING")
添加到user
类中的ClockAction
字段中。
这将为Neo4j OGM提供必要的提示,以将其拥有的User
数据放入您的user
字段中。
答案 1 :(得分:0)
我最终遵循了@meistermeier的建议,并注释了我的人际关系以提供指导。
下面是我的模型实体:
@NodeEntity
class ClockAction {
@Id @GeneratedValue
private Long id;
private String description
@Relationship(direction = Relationship.OUTGOING)
private User user;
@Relationship(direction = Relationship.OUTGOING)
private Office office;
}
@NodeEntity
class User {
@Id @GeneratedValue
private Long id;
private String name;
@Relationship(direction = Relationship.INCOMING)
private List<ClockAction> clockActions;
}
@NodeEntity
class Office {
@Id @GeneratedValue
private Long id;
private String name;
@Relationship(direction = Relationship.INCOMING)
private List<ClockAction> clockActions;
}
@meistermeier提出的查询建议对我不起作用,但给了我启发,我发现这种方法很好:
MATCH p((u:User)-[ur]-(c:ClockAction)-[or]-()) WHERE id(u) IN {ids} RETURN p, rels(p)