过滤关系的字段

时间:2018-07-06 09:59:11

标签: neo4j-ogm

我正在尝试获取给定关系的字段匹配的所有实体(我希望在结果中填写我的实体的关系)。尝试在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字段填写在结果实体上,用户始终为空...

我们将不胜感激:)

2 个答案:

答案 0 :(得分:0)

首先要注意一些事情

  1. 很遗憾,当前无法过滤id字段,因为过滤器仅适用于属性。使用id函数以密码查询id字段。 (id(n)!= n.id

  2. 您不是要查找关系实体(删除filter.setNestedRelationshipEntity(true);

现在您可以选择:

  1. 使用过滤器查询User类的另一个属性。

  2. 使用以下内容更改密码查询:"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为根):

Graph example

或者这样(用户作为具有多个ClockAction的root用户):

Graph example 2

您没有得到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)