Neo4j OGM - 无效 Filter.setRelationshipDirection()
Neo4j OGM - ineffective Filter.setRelationshipDirection()
我尝试使用以下代码加载整个对象(及其层次结构):
final Filter filter = new Filter (this.identity.name(),ComparisonOperator.EQUALS, identity);
filter.setRelationshipDirection(Relationship.OUTGOING);
final Filters filters = new Filters (filter);
final Collection<T> values = ogmSession.loadAll(this.classType,filters , -1);
if (values != null){
rvalue = values.iterator().next();
}
但是生成的查询是(有性能问题):
BoltRequest - Request: MATCH (n:`Procedure`) WHERE n.`name` = { `name_0` } WITH n MATCH p=(n)-[*0..]-(m) RETURN p, ID(n) with params {name_0=WMS-1-B}
而不是类似的东西(在最后一个 MATCH 子句中有关系方向):
MATCH (n:`Procedure`) WHERE n.`name` = { `name_0` } WITH n MATCH p=(n)-[*0..]->(m) RETURN p, ID(n) with params {name_0=WMS-1-B}
我是不是遗漏了什么或者是错误?
谢谢。
查询具有以下依赖项的 Neo4j 3.2 CE:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-core</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-bolt-driver</artifactId>
<version>2.1.3</version>
</dependency>
Filter
API 对此不是很清楚
setRelationshipDirection
(和setRelationshipType
)与嵌套属性上的过滤器匹配有关。最后一个 MATCH 总是 p=(n)-[*0..]-(m)
来加载所有相关节点(但也看到这个 feature request)。
也是根据领域模型自动设置的。例如:
Filter filter = new Filter("itemName", "item1");
filter.setNestedPropertyName("items");
filter.setNestedPropertyType(Item.class);
session.loadAll(User.class, filter);
会变成
MATCH (n:`User`) MATCH (m0:`Item`)
WHERE m0.`itemName` = { `items_itemName_0` }
MATCH (n)-[:`HAS_ITEM`]-(m0)
WITH n
MATCH p=(n)-[*0..1]-(m) // provide depth to change 1 to something else
RETURN ....
当前的 API 支持 Spring Data Neo4j 中的派生查找器,使用自定义查询可能更容易且更具可读性(这也允许您 directly specify what to return and map -参见部分保湿实体)。
好的,用queryForObject方法解决,例如:
T rvalue = ogmSession.queryForObject(this.classType,
"MATCH (n:`Procedure`) WHERE n.`name` = { `procedureName` } "+
"WITH n MATCH p=(n)-[*0..10]->(m) RETURN p, ID(n)", Values.parameters("procedureName",identity).asMap());
感谢大家。
我尝试使用以下代码加载整个对象(及其层次结构):
final Filter filter = new Filter (this.identity.name(),ComparisonOperator.EQUALS, identity);
filter.setRelationshipDirection(Relationship.OUTGOING);
final Filters filters = new Filters (filter);
final Collection<T> values = ogmSession.loadAll(this.classType,filters , -1);
if (values != null){
rvalue = values.iterator().next();
}
但是生成的查询是(有性能问题):
BoltRequest - Request: MATCH (n:`Procedure`) WHERE n.`name` = { `name_0` } WITH n MATCH p=(n)-[*0..]-(m) RETURN p, ID(n) with params {name_0=WMS-1-B}
而不是类似的东西(在最后一个 MATCH 子句中有关系方向):
MATCH (n:`Procedure`) WHERE n.`name` = { `name_0` } WITH n MATCH p=(n)-[*0..]->(m) RETURN p, ID(n) with params {name_0=WMS-1-B}
我是不是遗漏了什么或者是错误? 谢谢。
查询具有以下依赖项的 Neo4j 3.2 CE:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.4.RELEASE</version>
</parent>
<dependency>
<groupId>org.neo4j.driver</groupId>
<artifactId>neo4j-java-driver</artifactId>
<version>1.3.1</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-core</artifactId>
<version>2.1.3</version>
</dependency>
<dependency>
<groupId>org.neo4j</groupId>
<artifactId>neo4j-ogm-bolt-driver</artifactId>
<version>2.1.3</version>
</dependency>
Filter
API 对此不是很清楚
setRelationshipDirection
(和setRelationshipType
)与嵌套属性上的过滤器匹配有关。最后一个 MATCH 总是 p=(n)-[*0..]-(m)
来加载所有相关节点(但也看到这个 feature request)。
也是根据领域模型自动设置的。例如:
Filter filter = new Filter("itemName", "item1");
filter.setNestedPropertyName("items");
filter.setNestedPropertyType(Item.class);
session.loadAll(User.class, filter);
会变成
MATCH (n:`User`) MATCH (m0:`Item`)
WHERE m0.`itemName` = { `items_itemName_0` }
MATCH (n)-[:`HAS_ITEM`]-(m0)
WITH n
MATCH p=(n)-[*0..1]-(m) // provide depth to change 1 to something else
RETURN ....
当前的 API 支持 Spring Data Neo4j 中的派生查找器,使用自定义查询可能更容易且更具可读性(这也允许您 directly specify what to return and map -参见部分保湿实体)。
好的,用queryForObject方法解决,例如:
T rvalue = ogmSession.queryForObject(this.classType,
"MATCH (n:`Procedure`) WHERE n.`name` = { `procedureName` } "+
"WITH n MATCH p=(n)-[*0..10]->(m) RETURN p, ID(n)", Values.parameters("procedureName",identity).asMap());
感谢大家。