Neo4j Reactivity驱动程序如何与Meteor一起使用发布/订阅?

3
我正在开发一个Meteor应用程序,您可以在其中创建Neo4j“Room”节点和“DOOR”关系。每个房间应该只有一扇门通向任何其他给定的房间。
我正在使用Dmitriy Aristarkhovich的 Neo4j Reactivity驱动程序。
我想创建一个实时主从系统,用户所做的选择会影响到其他可选项。
为了说明这一点,在端口7474上的Neo4j浏览器中,我创建了一个简单的房间网络,如下图所示:
CREATE
(a:Room {name: "Room 1"})
-[:DOOR]->
(b:Room {name: "Room 2"}),
a-[:DOOR]->
(c:Room {name: "Room 3"}),
b-[:DOOR]->a
RETURN a, b, c

Rooms and doors

在这个模式下:
  • 房间1已经拥有它可以拥有的所有出门
  • 房间2可以通过一扇门连接到房间3
  • 房间3可以连接到房间1和房间2

我想展示两个下拉菜单:

  • 一个主菜单选择门的起始房间
  • 一个从属菜单,在给定起始房间的情况下选择可能的结束房间。

以下是我用于创建这些菜单的Meteor-flavour HTML:

<body>
  {{> addDoor}}
</body>

<template name="addDoor">
  <p>Add a Door from
    <select id="fromRoomName">
      {{#each fromRooms}}
        {{> fromRoom}}
      {{/each}}
    </select>

    to: 
    <select id="toRoomName">
      {{#each toRooms}}
        {{> toRoom}}
      {{/each}}
    </select>
  </p>
</template>

<template name="fromRoom">
  <option value="{{name}}">{{name}}</option>
</template>

<template name="toRoom">
  <option value="{{name}}">{{name}}</option>
</template>

当主菜单中选择Room 3时,这些菜单应该是这个样子。

Master-slave menus

这是我正在使用的 JavaScript 代码:

var queries = {
  "roomsForNewDoors": {
    collection: Meteor.neo4j.collection("RoomsForNewDoors")
  , query: 
     "MATCH (entrance:Room), (exit:Room) " +
     "WHERE NOT (entrance)-[:DOOR]->(exit) " +
     "AND entrance <> exit " +
     "RETURN entrance"
  , link: "entrance"
  }
, "newDoorsForRoom": {
    collection: Meteor.neo4j.collection("NewDoorsForRoom")
  , query: 
      "MATCH (entrance:Room), (exit:Room) " +
      "WHERE entrance.name = '{name}' " +
      "AND NOT (entrance)-[:DOOR]->(exit) " +
      "AND entrance <> exit " +
      "RETURN exit"
  , options: {name: "Room 2"}
  , link: "exit"
  }
}


if (Meteor.isServer) {
  ;(function (){
    var queryKeys = Object.keys(queries)
    queryKeys.forEach(publish)

    function publish(key) {
      var queryData = queries[key]
      var query = queryData.query
      var collection = queryData.collection

      collection.publish(key, publishCallback)

      function publishCallback(){
        return query
      }
    }
  })()
}


if (Meteor.isClient) {
  Tracker.autorun(function createSubscriptions(){
    var queryKeys = Object.keys(queries)
    queryKeys.forEach(subscribe)

    function subscribe(key) { //, index, array){
      var queryData = queries[key]
      var options = queryData.options
      var link = queryData.link
      var collection = queryData.collection
      var subscription = collection.subscribe(key, options, link)
    }
  })

  function getResults(queryData) {
    var collection = queryData.collection
    var cursor = collection.find()
    return cursor
  }

  Template.addDoor.events({
    'change #fromRoomName': function () {
      var fromRoomId = $("#fromRoomName :selected").text()
      Session.set("fromRoomId", fromRoomId)
    }
  })

  Template.addDoor.helpers({
    fromRooms: function() {
      var results = getResults(queries.roomsForNewDoors)
      return results
    }

  , toRooms: function () {
      var key = "newDoorsForRoom"
      var queryData = queries[key]
      var options = { name: Session.get("fromRoomId") }
      var link = queryData.link
      var collection = queryData.collection
      collection.subscribe(key, options, link)

      var results = getResults(queryData)
      return results
    }
  })
}

当我在Neo4j浏览器中测试这两个MATCH查询(例如,使用“Room 2”而不是'{name}'),我得到了我预期的结果。使用Neo4j反应驱动程序,第一个MATCH查询运行良好,但第二个查询产生了一组空结果。
我怀疑我没有理解发布/订阅过程的某些基本内容。如果能帮助我使此功能正常工作,我将不胜感激。
完整项目在此处可用:
git clone git@github.com:blackslate/Neo4j-issues.git
1个回答

4
这可能不是发布/订阅问题。尝试删除包围{name}参数的引号。
也就是说,将其改为:
"WHERE entrance.name = '{name}' "

to:

"WHERE entrance.name = {name} ".

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接