【问题标题】:Spring Data Neo4j is not creaing a relationshipSpring Data Neo4j 没有创建关系
【发布时间】:2014-06-16 15:12:46
【问题描述】:

我有一个存储库方法:

@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 中创建关系!

【问题讨论】:

  • “Entity”和“Story”在你的 POJO 和图表本身之间是否应该是同一类型?
  • 对不起,是的。这是我为将代码放在一般情况下所做的修改。我编辑了用实体替换故事的帖子
  • 好的。当你在那个“else”块中调用它时,“connectSimilar”的返回值是多少?
  • 总是假的,因为他无法添加relashionship
  • 好的,您的帖子中没有明确/指定,因为您说您收到“实体链接成功”消息。感谢您的澄清。

标签: neo4j spring-data-neo4j


【解决方案1】:

你试过了吗:

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

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

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

【讨论】:

  • 我试过这个@Query("START original=node({0}), n=node({1}) "+ "CREATE (original)-[r:SIMILAR]->(n ) "+ "RETURN original ") public Entity connectSimilar(Entity original, Entity newEntity);我有同样的结果
  • 你怎么称呼connectSimilar?你确定你将有效/正确的对象传递给方法吗?
  • 请看原文中公开的“Entity linkSimilarStory”。是的 C我传递的对象是有效的,因为我在调用 linkSimilar 后正在打印它们
  • 我做到了,在原版中它仍然让你传递 ID 属性字符串。我只是想确保您进行了适当的修改。不能太小心。老实说,我从未尝试在 @Query-annotated repo 中使用“CREATE”语句。
  • 哦,是的,我传递的是对象而不是 ids
猜你喜欢
  • 2016-11-29
  • 1970-01-01
  • 1970-01-01
  • 2014-01-04
  • 2018-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多