Spring Data Neo4j没有建立关系

时间:2014-06-16 15:12:46

标签: neo4j spring-data-neo4j

我有一个存储库方法:

@Query("MATCH (original:Entity{id:{0}}),(n:Entity{id:{1}}) "+ 
        "CREATE (original)-[r:SIMILAR]->(n) "+  
        "RETURN original ")
public Entity connectSimilar(String original, String new);

我用它来连接此服务方法中的实体:

@Transactional
    public Entity linkSimilarStory(String linkedTo, String linked) {
        System.out.println(linkedTo+" and "+linked);

        Entity original = this.findById(linkedTo);
        Entity newEntity = this.findById(linked);

        if(original != null && newEntity != null){

            if(this.checkIfSimilar(original.getNodeId(), newEntity.getNodeId())){
                System.out.println(original.getNodeId()+" and "+newEntity.getNodeId()+" are already Linked !!");
            }else{
                original = repository.connectSimilar(original.getId(), newEntity.getId());
                System.out.print("Entities linked successfully : "+original.getId()+" with "+newEntity.getId());
            }
            System.out.println(this.checkIfSimilar(original.getNodeId(), newEntity.getNodeId()));

        }
        return original;
    }

当我从控制器运行服务方法到链接2个现有节点时(我用println检查了它们的存在):

Transaction tx = neoTemplate.getGraphDatabaseService().beginTx();
Node otherNodeToLink = others.get(new Random().nextInt(others.size()-1));
//System.out.println("Linking "+root.getProperty("id").toString()+" And "+otherNodeToLink.getProperty("id").toString());
storyService.linkSimilarStory(root.getProperty("id").toString(), otherNodeToLink.getProperty("id").toString());
tx.close();

我收到了他们的ID消息Entities linked successfully

当我使用neo4j控制台检查时,没有创建任何关系!

直接在控制台中运行相同的查询,它会创建关系。

无法理解为什么它不能使用Spring数据:(

修改:

我也尝试过这样做:

Relationship rel = template.getNode(original.getNodeId()).createRelationshipTo(template.getNode(newEntity.getNodeId()), isSimilar);
System.out.println("Rel: "+rel.getType());

它显示Rel:RelationshipTypeToken [name:SIMILAR,id:7],但不保留在DB中创建关系!

1 个答案:

答案 0 :(得分:0)

你试过了吗?

@Query("START original={0}, n={1} "+ 
    "CREATE (original)-[r:SIMILAR]->(n) "+  
    "RETURN original ")
public Entity connectSimilar(Entity original, Entity new);

...因为您已经加载了实体POJO。然后从代码中传入“原始”和“newEntity”POJO。您不应该再次查找它们。

请告诉我们是否有效(我在SDN项目中没有尝试过这个,但查询看起来是正确的;必要时进行调整)。