检索所有相邻节点,其中节点是特定类型,并且至少一个节点不是特定三元组的主题

时间:2017-08-04 16:03:54

标签: sparql

我有一个SPARQL查询,用于检索与另一个特定类的实例相邻的特定类的所有实例。例如:

class FileUploadListener
{
    private $uploader;

    public function __construct(FileUploader $uploader)
    {
        $this->uploader = $uploader;
    }

    public function prePersist(LifecycleEventArgs $args)
    {
        $entity = $args->getEntity();

        $this->uploadFile($entity);
    }

    public function preUpdate(PreUpdateEventArgs $args)
    {
        $entity = $args->getEntity();

        $this->uploadFile($entity);
    }

    private function uploadFile($entity)
    {

        //Tried a lot of combinations with foreach, but not working :(        

        if (!$entity instanceof Product) {
            return;
        }

        $file = $entity->getImages();

        // only upload new files
        if (!$file instanceof UploadedFile) {
            return;
        }

        $fileName = $this->uploader->upload($file);
        $entity->setImages($fileName);
    }
}

让我们说上述查询的结果如下所示:

SELECT ?origin ?dependent WHERE {
  ?origin a :type1 . 
  ?origin ?somePredicate ?dependent. 
  ?dependent a :type2 .
}

因此,在这种情况下,指定类型的两个节点连接到?origin ?dependent node1 node3 node1 node4 node2 node5 node2 node6 node1。现在,我想将结果限制为那些node2结果,其中这两个节点中的至少一个不是特定三元组的主题,但是在它们中只有一个具有三元组的情况下仍然返回两者

让我们说图中存在以下三元组:

?dependent

假设node4 :isSubjectOf :thisTriple . node5 :isSubjectOf :thisTriple . node6 :isSubjectOf :thisTriple . 是节点3-6中唯一没有此特定三元组的节点。现在,我想写一个查询,让我的结果集看起来像这样:

node3

我希望我能够很好地理解这个问题。是否有一些方便有效的SPARQL技术来完成这样的事情?如果可能,我宁愿避免使用?origin ?dependent node1 node3 node1 node4

1 个答案:

答案 0 :(得分:3)

这是我设想您的数据的方式:

@prefix ns0: <http://example.com/> .

<http://example.com/node1>
  a <http://example.com/type1> ;
  ns0:somePredicate ns0:node3, ns0:node4 .

ns0:node2
  a ns0:type1 ;
  ns0:somePredicate ns0:node5, ns0:node6 .

ns0:node3
  a ns0:type2 ;
  ns0:isSubjectOf ns0:thisTriple .

ns0:node4 a ns0:type2 .
ns0:node5 a ns0:type2 .
ns0:node6 a ns0:type2 .

这是一个获得您要求的查询。只要为绑定它们的谓词使用不同的变量名,就可以在同一主题和同一对象之间创建不同的三元模式。

PREFIX  :     <http://example.com/>

SELECT  ?origin ?dependent
WHERE
  { ?origin   a                     :type1 ;
              ?somePredicate        ?dependent .
    ?dependent  a                   :type2 .
    ?origin   ?anyPred              ?theSubj .
    ?theSubj  :isSubjectOf          ?theTrip
  }

结果:

+--------+-----------+
| origin | dependent |
+--------+-----------+
| :node1 | :node3    |
| :node1 | :node4    |
+--------+-----------+