publish/subscribe 如何与 Meteor 的 Neo4j Reactivity 驱动程序一起工作

How does publish/subscribe work with the Neo4j Reactivity driver for Meteor

我正在开发一个 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

在此架构中:

我想显示两个下拉菜单:

这是我用来创建这些菜单的 Meteor 风味 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>

这是在主菜单中选择房间 3 时这些菜单的外观。

这是我正在使用的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 查询运行良好,但第二个查询产生一组空结果。

我怀疑 publish/subscribe 过程中有一些我不理解的基础知识。如果您能帮助我实现此功能,我将不胜感激。

完整项目可在此处获得:

git clone git@github.com:blackslate/Neo4j-issues.git

这可能不是 publish/subscribe 问题。尝试删除 {name} 参数周围的引号。

即变化:

"WHERE entrance.name = '{name}' "

至:

"WHERE entrance.name = {name} ".