当只请求一个节点时,Meteor / Neo4j会创建两个节点

时间:2015-08-31 12:11:16

标签: meteor neo4j

我已经与Meteor创建了一个简单的应用程序,以了解Neo4j和Meteor如何协同工作,使用Dmitriy Aristarkhovich的Neo4j Reactivity driver为流星。

当我使用Web客户端向Neo4j数据库添加新节点时,我看到在localhost:7474的Neo4j浏览器中出现了两个节点。这些节点具有相同的_id但不同的id。我没有设置" _id"或" id"在任何地方,所以可能这是在Meteor,各种Neo4j包装和驱动程序以及Neo4j本身之间添加的东西。

一个节点显示为带有"标签",另一个节点没有。

在我创建一个名为" Room 1"的节点之后,这是我在ASCII视图中显示的内容。和标签" Room"。

[*(2)]   [Room(1)]

(Room 1)
<id>:73 name:Room 1 _id:hLNZfesRg8mtPtyLW

(  75  )
<id>:75 name:Room 1 _id:hLNZfesRg8mtPtyLW

以下是“行”视图中显示的内容:

name    Room 1
_id hLNZfesRg8mtPtyLW

name    Room 1
_id hLNZfesRg8mtPtyLW

这里是代码: HTML

<body>
  {{> addRoom}}
</body>

<template name="addRoom">
  <h3>Add a Room</h3>
  <input id="newRoomName" placeholder="Type name here"> 
  <button class="button" id="addRoom">Add Room</button>
</template>

的JavaScript

var Rooms = Meteor.neo4j.collection("Rooms") // any collection name
var roomKey = "Rooms" // any publish-subscribe name

if (Meteor.isServer) {
  var roomQuery = "MATCH (room:Room) RETURN room"
  Rooms.publish(roomKey, publishRoomQuery)

  function publishRoomQuery(){
    return roomQuery
  }
}

if (Meteor.isClient) {
  Tracker.autorun(function trackDataChanges(){
    var options = null // becomes `this` in the publishRoomQuery() 
    var link = "room" // object name, to link as MongoDB row(s).
    var subscription = Rooms.subscribe(roomKey, options, link)
  })

  Template.addRoom.events({
    'click #addRoom': function () {
      var $input = $('#newRoomName')
      var roomName = $input.val()

      if(roomName){
        Rooms.insert({ // THE LINE THAT CALLS NEO4J
          name: roomName,
          __labels: ':Room'
        });
        $input.val('');
      }
    }
  })
}

这种行为是我应该期待的吗?我误解了一些基本的东西吗?或者这是否表明模块中存在与Meteor的Neo4j连接的错误?

注意:我已经按照我的应用程序here的方式安装了所有依赖项的方式,但我并不相信这就是问题所在。

修改

@MichaelHunger

我已将以下代码添加到Meteor.isServer部分:

  var constraint = "CREATE CONSTRAINT ON (room:Room) ASSERT room.name IS UNIQUE"
  Meteor.N4JDB.query(constraint, null, constraintCallback)

  function constraintCallback(error, data){
    console.log(error, data)
  }

但是,我仍然看到Meteor应用程序创建了两个节点。但是,当我在localhost:7474的Neo4j浏览器中运行此查询时,一切都按预期工作:

CREATE (r:Room {name: "Room2"}) RETURN r
// /!\  Neo.ClientError.Schema.ConstraintViolation
// Node 80 already exists with label Room and property "name"=[Room 1]

所以看起来好像正确设置了约束,但是Neo4j Reactivity Driver以某种方式绕过了约束。

0 个答案:

没有答案